【思维题】CodeForces 483 B Friends and Presents

【题目】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);
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值