CCPC2018-湖南全国邀请赛 HDU6286 2018【容斥】

2018

http://acm.hdu.edu.cn/showproblem.php?pid=6286

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1361    Accepted Submission(s): 662


 

Problem Description

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.

 

Input

The input consists of several test cases and is terminated by end-of-file.

Each test case contains four integers a,b,c,d.

 

Output

For each test case, print an integer which denotes the result.

## Constraint

* 1≤a≤b≤109,1≤c≤d≤109
* The number of tests cases does not exceed 104.

 

Sample Input

1 2 1 2018
1 2018 1 2018
1 1000000000 1 1000000000

Sample Output

3
6051
1485883320325200

Source

CCPC2018-湖南全国邀请赛-重现赛(感谢湘潭大学)

 

题意

在区间[a,b]中找一个x,在区间[c,d]中找一个y,问有多少对(x,y)满足x*y是2018的倍数

思路

2018=2*1009,只要x和y的乘积包含2和1009两个质因子就能满足条件

x1表示区间[a,b]中能被2整除的数的个数

y1表示区间[a,b]中能被1009整除的数的个数

z1表示区间[a,b]中能被2和1009整除的数的个数

x2表示区间[c,d]中能被2整除的数的个数

y2表示区间[c,d]中能被1009整除的数的个数

z2表示区间[c,d]中能被2和1009整除的数的个数

那么

x1-=z1 表示区间中只能能被2整除,但是不能被1009整除的数的个数

y1-=z1 表示区间中只能能被1009整除,但是不能被2整除的数的个数

x2-=z2 表示区间中只能能被2整除,但是不能被1009整除的数的个数

y2-=z2 表示区间中只能能被1009整除,但是不能被2整除的数的个数

因子2和1009要么x出,要么y出,要么两个都出,可以得到答案

x1*(y2+z2)   //x出2 y出1009

+

y1*(x2+z2)  //x出1009 y出2

+

z1*(d-c+1)  //x出2和1009 所有的y都满足要求

+

(b-a+1-x1-y1-z1)*z2 //x不出2也不出1009 此时y既要出2也要出1009

C++代码

#include
#include
#include
using namespace std;
typedef long long ll;
int main()
{
    ll a,b,c,d;
    while(scanf("%lld%lld%lld%lld",&a,&b,&c,&d)!=EOF){
        ll x1=b/2-(a-1)/2;
        ll x2=d/2-(c-1)/2;
        ll y1=b/1009-(a-1)/1009;
        ll y2=d/1009-(c-1)/1009;
        ll z1=b/2018-(a-1)/2018;
        ll z2=d/2018-(c-1)/2018;
        x1-=z1;
        x2-=z2;
        y1-=z1;
        y2-=z2;
        printf("%lld\n",x1*(y2+z2)+y1*(x2+z2)+z1*(d-c+1)+(b-a+1-x1-y1-z1)*z2);
    }
    return 0;
}

 

你可能感兴趣的:(算法)