bzoj 2986 Non-Squarefree Numbers

来源:互联网 发布:软件外包项目报价单 编辑:程序博客网 时间:2024/06/05 04:22

2986: Non-Squarefree Numbers

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 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;}


原创粉丝点击