• bzoj 2986: Non-Squarefree Numbers【容斥+莫比乌斯函数】


    看到( 10^10 )的范围首先想到二分,然后把问题转化为判断( [1,n] )内有多少个是某个质数的平方和的数。
    所以应该是加上是一个质数的平方的个数减去是两个质数的平方的个数加上是三个质数的平方的个数……注意到这正好是莫比乌斯函数反过来,所以 ( re-=mb[i]*n/(i*i) ) 即可

    #include<iostream>
    #include<cstdio>
    using namespace std;
    const int N=300005;
    int p[N],tot,mu[N];
    long long n,mb[N],ans;
    bool v[N];
    long long wk(long long n)
    {
    	long long re=0ll;
    	for(long long i=2;i*i<=n;i++)
    		re-=mb[i]*n/(i*i);//cout<<re<<endl;
    	return re;
    }
    int main()
    {
    	mb[1]=1;
    	for(int i=2;i<=N-5;i++)
    	{
    		if(!v[i])
    		{
    			p[++tot]=i;
    			mb[i]=-1;
    		}
    		for(int j=1;j<=tot&&i*p[j]<=N-5;j++)
    		{
    			int k=i*p[j];
    			v[k]=1;
    			if(i%p[j]==0)
    			{
    				mb[k]=0;
    				break;
    			}
    			mb[k]=-mb[i];
    		}
    	}
    	scanf("%lld",&n);
    	long long l=0ll,r=30000000000ll;
    	while(l<=r)
    	{
    		long long mid=(l+r)>>1ll;
    		if(wk(mid)<n)
    			l=mid+1;
    		else
    			ans=mid,r=mid-1;
    	}
    	printf("%lld",ans);
    	return 0;
    }
    
  • 相关阅读:
    算法 在一个递增的二维数组中查找一个数
    java web----网络编程基础
    java----集合(Map)
    java----集合(List、set)
    java----数组
    java面试----1
    java----NIO
    java----commons-io
    java----文件操作
    爬虫----爬取答案
  • 原文地址:https://www.cnblogs.com/lokiii/p/8213245.html
Copyright © 2020-2023  润新知