2986: Non-Squarefree Numbers
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 53 Solved: 30
[Submit][Status][Discuss]
Description
一个正整数K被称为squarefree,如果它没有一个D^2(D>1)这样的约数。
Input
读入一个正整数N
Output
找出第N个不是squarefree的数。1<=N<=10^10
Sample Input
10
Sample Output
27
Hint
前10个非squarefree的数
4 8 9 12 16 18 20 24 25 27
二分答案容斥原理……挺裸的。
#include <iostream> using namespace std; typedef long long ll; const ll N=100000000000; ll tot,n,i,j,k,ans,l,r,mid; ll p[200011]; bool v[1000011]; ll dfs(int dep,int b,ll lef){ ll o,ans=0; if (dep&1)o=1;else o=-1; for (int i=b;i<=tot;i++) if (p[i]*p[i]>lef)break; else ans+=lef/(p[i]*p[i])*o+dfs(dep+1,i+1,lef/(p[i]*p[i])); return ans; } int main(){ for (i=2;i<1000000;i++) if (!v[i]){ p[++tot]=i; for (j=i;j<=1000000/i;j++) v[i*j]=1; } cin>>n; l=1,r=N; while (l!=r){ mid=(l+r)/2; ans=dfs(1,1,mid); if (ans<n)l=mid+1; else r=mid; } cout<<l; return 0; }