链接:https://ac.nowcoder.com/acm/contest/1107/K 来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536K Special Judge, 64bit IO Format: %lld 题目描述 Given a, b, c, d, find out the number of pairs of integers (x, y) where a≤x≤b,c≤y≤da \leq x \leq b, c \leq y \leq da≤x≤b,c≤y≤d and x⋅yx \cdot yx⋅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 输入
1 2 1 2018 1 2018 1 2018 1 1000000000 1 1000000000输出
3 6051 1485883320325200备注:
1≤a≤b≤109,1≤c≤d≤1091 \leq a \leq b \leq 10^9, 1 \leq c \leq d \leq 10^91≤a≤b≤109,1≤c≤d≤109The number of tests cases does not exceed 10410^4104.题解: 题目很巧妙,数字给的比较巧妙,2018进行分解,只有两种情况: 12018=2018 21009=2018 那么我们明显可以看到,区间a-b的所有奇数,都只能乘区间c-d的所有2018的倍数(包括2018),得到的结果一定是2018的倍数,而区间a-b的所有偶数,可以乘区间c-d的所有1009的倍数(包括1009)得到的一定是2018的倍数,这个无须质疑了,那么这样就简单了呀,统计区间a-b的奇数和偶数分别多少个,再统计区间c-d的1009和2018的倍数个数分别多少个,然后相乘累加。
定义区间a-b代号为A,区间c-d代号为B,奇数个数为1,偶数为2
A1表示区间A的奇数个数,A2表示区间B的奇数个数,A1009表示区间A的1009倍数个数,A2018表示区间A的倍数个数,B同样这样表示。
那么计算公式就为: ans=A1B2018+A2(B2018+B1009) 但是计算是有个问题的,因因为区间A本身也有1009和2018,而1009属于奇数,2008为偶数,并且区间A的所有1009的倍数都是可以和区间B的所有偶数相乘的,区间A的所有2018的倍数都是可以和区间B的所有数字相乘的,所以正确的计算是这样的,A中1009和2018的倍数需要特殊考虑,所以分别从奇数和偶数中除名。 ans=(A1-A1009)B2018+(A2-A2018)(B2018+B1009)+A1009B2+A2018(B1+B2); 这样就彻底没问题了。 !!!这里还得注意,1009的倍数包含了2018的倍数,但是我这里1009的倍数一定不能和2018的倍数重复,所以计算的时候。1009的倍数针对偶数倍数。
AC代码
#include<bits/stdc++.h> #include<fstream> using namespace std; typedef long long ll; int main() { ll a,b,c,d; while(cin>>a>>b>>c>>d) { ll t1,t2; t1=t2=(b-a+1)/2; if((b-a+1)%2==1) { if(a%2==1) t1++; else t2++; } ll ta1009=0,ta2018=0; if(b!=a) { ta1009=(b/1009)-(a/1009); if(a09==0) ta1009++; ta2018=(b/2018)-(a/2018); if(a 18==0) ta2018++; //减去和2018重复倍数个数 ta1009-=ta2018; } else { if(a09==0&&a 18!=0) { ta1009=1; } else if(a 18==0) { ta2018=1; } } ll t3,t4; t3=t4=(d-c+1)/2; if((d-c+1)%2==1) { if(c%2==1) t3++; else t4++; } ll tb1009=0,tb2018=0; if(c!=d) { tb1009=(d/1009)-(c/1009); if(c09==0) tb1009++; tb2018=(d/2018)-(c/2018); if(c 18==0) tb2018++; tb1009-=tb2018; } else { if(c09==0&&c 18!=0) { tb1009=1; } else if(c 18==0) { tb2018=1; } } ll ans=(t1-ta1009)*(tb2018)+(t2-ta2018)*(tb1009+tb2018)+ta1009*t4+ta2018*(t3+t4); cout<<ans<<endl; } return 0; }