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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

之江学院第0届 A qwb与支教 容斥与二分

發布時間:2025/3/8 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 之江学院第0届 A qwb与支教 容斥与二分 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

  題目鏈接:?http://115.231.222.240:8081/JudgeOnline/problem.php?cid=1005&pid=0

  題目描述: 給你三個數x, y, z 和 N 輸出從1開始數第N個不是x, y, z 任意一個數的倍數的數字

  解題思路: 一看到倍數我先想到素數唯一分解定理, 但是這個想法不結合實際, 因為N <= 10^17所以挨個遍歷肯定是不切合實際的, 然后我在想是不是可以可以素數篩法, 更是不行。

        于是上網上看了題解, 既然不是倍數不好求, 那么我就先求好求的倍數, ans = mid/x + mid/y + mid/z - mid/lcm(x, y) - mid/lcm(y,z) - mid/lcm(x,z) + mid/lcm(x,y,z)

        其中ans 是 1 ~ ans 中是x, y, z的倍數的個數。 那么答案就應該是true_ans + N = mid 所以再二分就可以了。 這里有一個小小的trick, 就是說lcm(x,y,z)有可能會爆longlong

        特判一下即可。

  代碼: ps: 網站交不了題, 這個代碼只是思路的實現, 并不是AC代碼。

#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <string> #include <map> #include <set> #include <vector> #include <cmath> using namespace std;typedef long long LL; const LL MAXN = 1e18;LL lcm(LL a, LL b) {LL GCD = __gcd(a, b);LL ans = a / GCD;if( MAXN / ans < b ) return 0;else return ans * b; }int main() {LL x, y, z, N;while( ~scanf("%lld%lld%lld%lld", &x, &y, &z, &N) ) { // cout << x << " " << y << " " << z << " " << N << endl;LL left = 0;LL right = MAXN;while( left < right-1 ) { // cout << left << " " << right << endl;LL mid = (left + right) / 2;LL ans = mid/x + mid/y + mid/z - mid/lcm(x, y) - mid/lcm(x, z) - mid/lcm(y, z);LL t = lcm(lcm(x, y), z);if( t ) ans += mid/t;if( mid - ans >= N ) {right = mid;}else {left = mid;}}printf( "%lld\n", right );}return 0; } View Code

  思考: 自己還是太弱了, 我嘗試著去想, 但是還是沒想出來, 其實這道題很容易往容斥那里去想的, 畢竟都給出來了三個數, 還是倍數題, 二分也不難想, 慢慢總結經驗吧

?

轉載于:https://www.cnblogs.com/FriskyPuppy/p/7070425.html

總結

以上是生活随笔為你收集整理的之江学院第0届 A qwb与支教 容斥与二分的全部內容,希望文章能夠幫你解決所遇到的問題。

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