【题目】http://codeforces.com/problemset/problem/483/B
【题意】
有两个 friends,需要将 cnt1 个不能整除 x 的数分给第一个friend,cnt2 个不能整除 y 的数分给第二个friend。x 和 y 都是素数来的。要求求出最小的 v,v 表示可以从1,2,...,v 中取数。
【思路】1:x/n就是1-x中能整除n的数的个数。
2:(总数-能被x和y整除的个数)>=cnt1+cnt2 && (总数-能被x整除的个数)> =cnt1 && (总数-能被y整除的个数) >= cnt2 就能保证这列数满足要求。
3:二分。
【另一个参考】http://www.cnblogs.com/windysai/p/4058235.html
【代码】
#include<cstdio>
typedef long long ll;
const ll M=1e11+10;
int main()
{
ll cnt1,cnt2;
int x,y;
scanf("%lld%lld%d%d",&cnt1,&cnt2,&x,&y);
ll l=1,r=M;
while(l<r)
{
ll mid=(l+r)/2;
if(mid-mid/(x*y)>=cnt1+cnt2&&mid-mid/x>=cnt1&&mid-mid/y>=cnt2)
r=mid;
else
l=mid+1;
}
printf("%lld\n",l);
}