欢迎访问 生活随笔!

生活随笔

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

编程问答

codeforces B. Friends and Presents(二分+容斥)

发布时间:2025/3/8 编程问答 42 豆豆
生活随笔 收集整理的这篇文章主要介绍了 codeforces B. Friends and Presents(二分+容斥) 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

题意:从1....v这些数中找到c1个数不能被x整除,c2个数不能被y整除!
并且这c1个数和这c2个数没有相同的!给定c1, c2, x, y, 求最小的v的值!

思路: 二分+容斥,二分找到v的值,那么s1 = v/x是能被x整除的个数
s2 = v/y是能被y整除数的个数,s3 = v/lcm(x, y)是能被x,y的最小公倍数
整除的个数!
那么 v-s1>=c1 && v-s2>=c2 && v-s3>=c1+c2就是二分的条件!

1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<algorithm> 5 using namespace std; 6 7 int gcd(int x, int y){ 8 return y==0 ? x : gcd(y, x%y); 9 } 10 11 int lcm(int x, int y){ 12 return x*y/gcd(x, y); 13 } 14 15 int main(){ 16 long long ld = 1, rd = 100000000000000ll, mid; 17 long long c1, c2, x, y; 18 cin>>c1>>c2>>x>>y; 19 while(ld <= rd){ 20 mid = (ld + rd)>>1; 21 long long s1 = mid/x, s2 = mid/y, s3 = mid/lcm(x, y); 22 if(mid-s1 >= c1 && mid-s2 >= c2 && mid-s3 >= c1+c2) rd = mid-1; 23 else ld = mid+1; 24 } 25 cout<<rd+1<<endl; 26 return 0; 27 } View Code

 

转载于:https://www.cnblogs.com/hujunzheng/p/4049969.html

总结

以上是生活随笔为你收集整理的codeforces B. Friends and Presents(二分+容斥)的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。