300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > 牛客国庆集训派对day2 K (容斥)

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

时间:2023-06-26 11:10:43

相关推荐

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

链接:/acm/contest/1107/K

来源:牛客国庆集训派对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 .输入描述

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

1 1

1 1000000000 1 1000000000输出

3

6051

1485883320325200备注

1 ≤ a ≤ b ≤ 109,1 ≤ c ≤ d ≤ 109

The number of tests cases does not exceed 104.

题意:给两个区间,这两个区间内分别取一个数使得这两个数的乘积是 的倍数。

思路: 的因子有 1,2,1009,。我们将这些因子互相配对。

(1k,k)

(2k,1009k)

(1009k,2k)

(k,1k)

其中存在重复的对数

(2k,k)

(1009k,k):这两个重复删除了一次(k,k)

(k,k)

(k,2k)

(k,1009k):这两个重复删除了一次(k,k)

对于因子的个数容斥的方法来求即可。

#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_ = r1 / - (l1 - 1) / ;//cout<<cnt1_1<<" "<<cnt1_2<<" "<<cnt1_1009<<" "<<cnt1_<<endl;int cnt2_1 = r2 - (l2 - 1), cnt2_2 = r2 / 2 - (l2 - 1) / 2;int cnt2_1009 = r2 / 1009 - (l2 - 1) / 1009, cnt2_ = r2 / - (l2 - 1) / ;//cout<<cnt2_1<<" "<<cnt2_2<<" "<<cnt2_1009<<" "<<cnt2_<<endl;ll ans = (ll)cnt1_1 * (ll)cnt2_ + (ll)cnt1_2 * (ll)cnt2_1009 + (ll)cnt1_1009 * (ll)cnt2_2 +(ll)cnt1_ * (ll)cnt2_1;ans -= ((ll)cnt1_2 + (ll)cnt1_1009) * (ll)cnt2_;ans -= ((ll)cnt2_2 + (ll)cnt2_1009) * (ll)cnt1_;//ans+=(ll)cnt1_*(ll)cnt2_;//ans-=(ll)cnt1_1009*(ll)cnt2_;//ans-=(ll)(cnt1_)*(ll)cnt2_1009;ans += (ll)cnt1_ * (ll)cnt2_;printf("%lld\n", ans);}return 0;}/*** Copyright(c)* All rights reserved.* Author : Max_n* Date : -10-02-14.26.07* Problem : */

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。