zoukankan      html  css  js  c++  java
  • [BZOJ2440][中山市选2011]完全平方数

    题面戳我
    题意
    给出k,求第k个不是完全平方数的倍数的数是多少。k<=10^9

    sol

    这题高神写的容斥。
    所以我写的是莫比乌斯反演。。。
    我们记一个函数(f(i)=)只是(i^2)的倍数而不是其他完全平方数的倍数的个数。又令:

    [F(i)=sum_{i|d}^{n}f(d) ]

    易知(F(i)=lfloor frac {n}{i^2} floor)
    所以我们直接莫比乌斯反演

    [f(1)=sum_{i=1}^{sqrt n}mu(i)lfloor frac {n}{i^2} floor ]

    然后二分一下这个n就可以了。
    复杂度(O(Tlog nsqrt n))还是能过的

    code

    #include<cstdio>
    #include<algorithm>
    using namespace std;
    #define ll long long
    const int N = 1000005;
    
    int gi()
    {
    	int x=0,w=1;char ch=getchar();
    	while ((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
    	if (ch=='-') w=0,ch=getchar();
    	while (ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
    	return w?x:-x;
    }
    
    int mu[N+5],zhi[N+5],pri[N+5],tot;
    void Mobius()
    {
    	mu[1]=1;zhi[1]=1;
    	for (int i=2;i<=N;i++)
    	{
    		if (!zhi[i]) pri[++tot]=i,mu[i]=-1;
    		for (int j=1;j<=tot&&i*pri[j]<=N;j++)
    		{
    			zhi[i*pri[j]]=1;
    			if (i%pri[j]) mu[i*pri[j]]=-mu[i];
    			else {mu[i*pri[j]]=0;break;}
    		}
    	}
    }
    ll check(ll mid)
    {
    	ll res=0;
    	for (ll i=1;i*i<=mid;i++)
    		res+=mu[i]*(mid/(i*i));
    	return res;
    }
    int main()
    {
    	Mobius();
    	int T=gi();
    	while (T--)
    	{
    		ll k=gi();
    		ll l=0,r=k*10;
    		while (l<r)
    		{
    			ll mid=(l+r)>>1;
    			if (check(mid)>=k) r=mid;
    			else l=mid+1;
    		}
    		printf("%lld
    ",l);
    	}
    	return 0;
    }
    
  • 相关阅读:
    python发送邮件
    常用的排序算法
    关于前端ajax请求url为何添加一个随机数
    RabbitMQ消息队列
    shell编程基本语法和变量
    第70课 展望:未来的学习之路(完结)
    第69课 技巧:自定义内存管理
    第68课 拾遗:让人迷惑的写法
    第67课 经典问题解析五
    第66课 C++中的类型识别
  • 原文地址:https://www.cnblogs.com/zhoushuyu/p/8245235.html
Copyright © 2011-2022 走看看