zoukankan      html  css  js  c++  java
  • Codeforces483B. Friends and Presents(二分+容斥原理)

    题目链接:传送门

    题目:

    B. Friends and Presents
    time limit per test
    1 second
    memory limit per test
    256 megabytes
    input
    standard input
    output
    standard output
    
    You have two friends. You want to present each of them several positive integers. You want to present cnt1 numbers to the first friend and cnt2 numbers to the second friend. Moreover, you want all presented numbers to be distinct, that also means that no number should be presented to both friends.
    
    In addition, the first friend does not like the numbers that are divisible without remainder by prime number x. The second one does not like the numbers that are divisible without remainder by prime number y. Of course, you're not going to present your friends numbers they don't like.
    
    Your task is to find such minimum number v, that you can form presents using numbers from a set 1, 2, ..., v. Of course you may choose not to present some numbers at all.
    
    A positive integer number greater than 1 is called prime if it has no positive divisors other than 1 and itself.
    Input
    
    The only line contains four positive integers cnt1, cnt2, x, y (1 ≤ cnt1, cnt2 < 109; cnt1 + cnt2 ≤ 109; 2 ≤ x < y ≤ 3·104) — the numbers that are described in the statement. It is guaranteed that numbers x, y are prime.
    Output
    
    Print a single integer — the answer to the problem.
    Examples
    Input
    Copy
    
    3 1 2 3
    
    Output
    Copy
    
    5
    
    Input
    Copy
    
    1 3 2 3
    
    Output
    Copy
    
    4
    
    Note
    
    In the first sample you give the set of numbers {1, 3, 5} to the first friend and the set of numbers {2} to the second friend. Note that if you give set {1, 3, 5} to the first friend, then we cannot give any of the numbers 1, 3, 5 to the second friend.
    
    In the second sample you give the set of numbers {3} to the first friend, and the set of numbers {1, 2, 4} to the second friend. Thus, the answer to the problem is 4.
    View Code

    题目大意:

      已知素数x,y,要求从1开始分别分配cnt1,cnt2个数给x,y,且分配给x的数不能是x的倍数,分配给y的数不能是y的倍数。求所有分掉的数中的最大值的最小值。

      1 ≤ cnt1, cnt2 < 109; cnt1 + cnt2 ≤ 109; 2 ≤ x < y ≤ 3·104

    思路:

      如果已知答案mid(滑稽):

      那么1-mid之间所有x的倍数不能分给x,那么优先分给y;

      同理:y的倍数都先分给x。当然lcm(x, y) = xy的倍数不能分,要减去这部分(容斥)。

      然后比较mid的没分配的部分,和cnt1,cnt2没分到的部分。

      这样可以用O(n)的时间验证答案,且答案是单调的,故用二分搞。

    代码:

    #include <bits/stdc++.h>
    
    using namespace std;
    typedef long long ll;
    
    ll cnt1, cnt2, x, y;
    
    bool judge(ll mid) {
        ll mul_of_x = mid/x;
        ll mul_of_y = mid/y;
        ll mul_of_xy = mid/x/y;
        ll tmp = mid - mul_of_x - mul_of_y + mul_of_xy;
        ll resx = max(cnt1 - mul_of_y + mul_of_xy, (ll)0);
        ll resy = max(cnt2 - mul_of_x + mul_of_xy, (ll)0);
        return resx + resy <= tmp;
    }
    
    int main()
    {
        cin >> cnt1 >> cnt2 >> x >> y;
        ll l = 0, r = 1e18;
        ll ans = r;
        while (l <= r) {
            ll mid = (l+r) >> 1;
            if (judge(mid)) {
                ans = min(ans, mid);
                r = mid-1;
            }
            else
                l = mid+1;
        }
        cout << ans << endl;
        return 0;
    }
    View Code
  • 相关阅读:
    HTML网页背景图很长要有滚动条滑动
    CentOS 6.6下安装配置Tomcat环境
    centos安装jdk1.7.80的rpm包
    vmware12共享windows的文件给虚拟的linux
    Oracle jdk 历史版本官方下载地址及下载方法
    CentOS所有版本下载地址分享
    为什么说docker可以保护Nginx、Tomcat、Mysql呢?
    Linux下安装Nginx依赖包和Nginx的命令
    Nginx的启动、停止、重启
    nginx无法启动: libpcre.so.1/libpcre.so.0: cannot open shared object file解决办法
  • 原文地址:https://www.cnblogs.com/Lubixiaosi-Zhaocao/p/9951673.html
Copyright © 2011-2022 走看看