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;
}