日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

BZOJ2986 Non-Squarefree Numbers

發布時間:2025/4/16 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 BZOJ2986 Non-Squarefree Numbers 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

神馬的容斥原理實在是太神啦!

就是先二分一個數mid,看看有幾個滿足要求的數比他小。

查看的方法就是容斥原理。。。

res =?((2 ^ 2)倍數個數 - ((2 ^ 2) * (3 ^ 2)倍數個數 + (2 ^ 2) * (5 ^ 2)倍數個數 + ...) + (((2 ^ 2) * (3 ^ 2) * (5 ^ 2)倍數個數 + .....)) + ((3 ^ 2)倍數個數...)

我去。。。這復雜度真的能過= =

?

1 /************************************************************** 2 Problem: 2986 3 User: rausen 4 Language: C++ 5 Result: Accepted 6 Time:1512 ms 7 Memory:5688 kb 8 ****************************************************************/ 9 10 #include <cstdio> 11 12 using namespace std; 13 typedef long long ll; 14 const int N = 1000005; 15 16 int p[N], cnt; 17 bool F[N]; 18 ll n; 19 20 ll find(int f, int i, ll mid) { 21 ll res = 0, sqr; 22 for (; i <= cnt && (sqr = (ll) p[i] * p[i]) <= mid; ++i) 23 res += (ll) mid / sqr * f + find(-f, i + 1, mid / sqr); 24 return res; 25 } 26 27 void pre_work(int M) { 28 int i, j; 29 for (i = 2; i <= M; ++i) { 30 if (!F[i]) 31 p[++cnt] = i; 32 for (j = 1; i * p[j] <= M && j <= cnt; ++j) { 33 F[i * p[j]] = 1; 34 if (i % p[j] == 0) break; 35 } 36 } 37 } 38 39 int main() { 40 pre_work(N); 41 scanf("%lld", &n); 42 ll l = 1, r = (ll) 1e11, mid; 43 while (l < r) { 44 mid = (ll) l + r >> 1; 45 if (find(1, 1, mid) < n) l = mid + 1; 46 else r = mid; 47 } 48 printf("%lld\n", l); 49 return 0; 50 } View Code

(p.s. Rank.10)

轉載于:https://www.cnblogs.com/rausen/p/4114969.html

總結

以上是生活随笔為你收集整理的BZOJ2986 Non-Squarefree Numbers的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。