2986: Non-Squarefree Numbers
Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 349 Solved: 162
[ 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
HINT
Source
【分析】
傻傻写不对二分
同 bzoj 完全平方数
【代码】
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 1000000
#define ll long long
#define fo(i,j,k) for(i=j;i<=k;i++)
using namespace std;
const int mxn=1000005;
bool vis[mxn];
ll n,ans;
int miu[mxn],pri[mxn];
inline void init()
{
int i,j;
fo(i,2,N)
{
if(!vis[i]) pri[++pri[0]]=i,miu[i]=1;
for(j=1;j<=pri[0] && i*pri[j]<=N;j++)
{
vis[i*pri[j]]=1;
if(i%pri[j]==0) break;
miu[i*pri[j]]=-miu[i];
}
}
}
inline ll solve(ll mid)
{
ll i,res=0,up=sqrt(mid);
fo(i,1,up)
res+=mid/(i*i)*miu[i];
return res;
}
int main()
{
int i,j;
init();
scanf("%lld",&n);
ll l=1,r=1000000000000LL;
while(l<r)
{
ll mid=l+r>>1;
if(solve(mid)<n) l=mid+1;
else r=mid;
}
printf("%lld\n",l);
return 0;
}