题意:给你两个数据范围,x和y分别是这两个数据范围中的数,问你x*y有多少个是2017的倍数。
注意:整数(1,2)和整数(2,1)算是不同的,因为他们出自两个不同范围。
题解:我们先统计两个数据范围内的2017的倍数的个数,因为任何数*2017的倍数还是2017的倍数。
答案=第一个范围2017的倍数的个数 * 第二个范围长度+第二个范围2017的倍数的个数 * 第一个范围长度-算重的 (第一个范围2017的倍数的个数 * 第二个范围2017的倍数的个数 )
解释一下算重的:当你算第一个范围2017的倍数的个数 * 第二个范围长度,所有第一范围内的2017倍数的个数都乘上了第二个范围中的所有数,第二范围2017的倍数的个数也都乘上了第一范围的所有数,两次计算的时候两个范围内的2017的倍数的个数算了两遍。
一对数【x,y】 x永远是第一范围内的,y永远是第二范围的。
例如 第一范围内2017倍数为2017 4034 第二范围 4034 6051
第一个范围2017的倍数的个数 * 第二个范围长度:
【2017,4034】【2017,6051】【4034,4034】【4034,6051】
第二个范围2017的倍数的个数 * 第一个范围长度
【2017, 4034】【4034,4034】【2017,6051】【4034,6051】
很明显,这两个算重了,减去第一个范围2017的倍数的个数 * 第二个范围2017的倍数的个数。
代码很简单,需要理解。
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
typedef unsigned long long ll;
int main()
{
ll a,b,c,d,p;
while(cin>>a>>b>>c>>d)
{
ll num1=b/2017-(a-1)/2017;
ll num2=d/2017-(c-1)/2017;
cout<<num1*(d-c+1)+num2*(b-a+1)-num1*num2<<endl;
}
return 0;
}