2019牛客国庆集训派对day2 K 2018(容斥)

链接:https://ac.nowcoder.com/acm/contest/1107/K
来源:2019牛客国庆集训派对day2

  • 题目描述
      Given a, b, c, d, find out the number of pairs of integers (x, y) where a ≤ x ≤ b ,c ≤ y ≤ d and x⋅y is a multiple of 2018.
  • 输入描述
    The input consists of several test cases and is terminated by end-of-file.
    Each test case contains four integers a, b, c, d.
  • 输出描述
    For each test case, print an integer which denotes the result.
  • 输入
    1 2 1 2018
    1 2018 1 2018
    1 1000000000 1 1000000000
  • 输出
    3
    6051
    1485883320325200
  • 备注
    1 ≤ a ≤ b ≤ 109,1 ≤ c ≤ d ≤ 109
    The number of tests cases does not exceed 104.

  题意:给两个区间,这两个区间内分别取一个数使得这两个数的乘积是 2018 的倍数。
  思路:2018 的因子有 1,2,1009,2018。我们将这些因子互相配对。
  (1k,2018k)
  (2k,1009k)
  (1009k,2k)
  (2018k,1k)
  其中存在重复的对数
  (2k,2018k)
  (1009k,2018k):这两个重复删除了一次(2018k,2018k)
  (2018k,2018k)
  (2018k,2k)
  (2018k,1009k):这两个重复删除了一次(2018k,2018k)
  对于因子的个数容斥的方法来求即可。

#include<bits/stdc++.h>
using namespace std;

typedef long long ll;
const int Max_n = 1e6 + 10;

int main() {
    int l1, r1, l2, r2;
    while(~scanf("%d%d%d%d", &l1, &r1, &l2, &r2)) {
        int cnt1_1 = r1 - (l1 - 1), cnt1_2 = r1 / 2 - (l1 - 1) / 2;
        int cnt1_1009 = r1 / 1009 - (l1 - 1) / 1009, cnt1_2018 = r1 / 2018 - (l1 - 1) / 2018;
        //cout<<cnt1_1<<" "<<cnt1_2<<" "<<cnt1_1009<<" "<<cnt1_2018<<endl;
        int cnt2_1 = r2 - (l2 - 1), cnt2_2 = r2 / 2 - (l2 - 1) / 2;
        int cnt2_1009 = r2 / 1009 - (l2 - 1) / 1009, cnt2_2018 = r2 / 2018 - (l2 - 1) / 2018;
        //cout<<cnt2_1<<" "<<cnt2_2<<" "<<cnt2_1009<<" "<<cnt2_2018<<endl;
        ll ans = (ll)cnt1_1 * (ll)cnt2_2018 + (ll)cnt1_2 * (ll)cnt2_1009 + (ll)cnt1_1009 * (ll)cnt2_2 +
                 (ll)cnt1_2018 * (ll)cnt2_1;
        ans -= ((ll)cnt1_2 + (ll)cnt1_1009) * (ll)cnt2_2018;
        ans -= ((ll)cnt2_2 + (ll)cnt2_1009) * (ll)cnt1_2018;
        //ans+=(ll)cnt1_2018*(ll)cnt2_2018;
        //ans-=(ll)cnt1_1009*(ll)cnt2_2018;
        //ans-=(ll)(cnt1_2018)*(ll)cnt2_1009;
        ans += (ll)cnt1_2018 * (ll)cnt2_2018;
        printf("%lld\n", ans);
    }
    return 0;
}




/**
* Copyright(c)
* All rights reserved.
* Author : Max_n
* Date : 2019-10-02-14.26.07
* Problem : 2018
*/
发布了166 篇原创文章 · 获赞 68 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_42217376/article/details/101938947