[BZOJ2440][中山市选2011]完全平方数（莫比乌斯函数，二分）

mark一个博客：http://blog.csdn.net/acdreamers/article/details/8542292

 1 #include <bits/stdc++.h>
2 using namespace std;
3
4 typedef long long LL;
5 const LL maxn = 1001000;
6 LL vis[maxn], mu[maxn], prime[maxn], cnt;
7 LL n;
8
9 void init() {
10     memset(vis,0,sizeof(vis));
11     mu[1] = 1;
12     cnt = 0;
13     for(LL i=2; i<maxn; i++) {
14         if(!vis[i]) {
15             prime[cnt++] = i;
16             mu[i] = -1;
17         }
18         for(LL j=0; j<cnt&&i*prime[j]<maxn; j++) {
19             vis[i*prime[j]] = 1;
20             if(i%prime[j]) mu[i*prime[j]] = -mu[i];
21             else {
22                 mu[i*prime[j]] = 0;
23                 break;
24             }
25         }
26     }
27 }
28
29 bool check(LL x) {
30     LL xx = (LL)sqrt(x);
31     LL ret = 0;
32     for(LL i = 1; i <= xx; i++) {
33         ret += mu[i]*(LL)(x/(i*i));
34     }
35     return ret < n;
36 }
37
38 signed main() {
39     // freopen("in", "r", stdin);
40     init();
41     LL T;
42     scanf("%lld", &T);
43     while(T--) {
44         scanf("%lld", &n);
45         LL lo = 1, hi = (LL)1e10;
46         LL ret = 0;
47         while(lo <= hi) {
48             LL mid = (lo + hi) >> 1;
49             if(check(mid)) lo = mid + 1;
50             else hi = mid - 1;
51         }
52         printf("%lld\n", lo);
53     }
54     return 0;
55 }

posted @ 2017-07-27 23:25  Kirai  阅读(168)  评论(0编辑  收藏  举报