题意:
给出 a , b , c , d a,b,c,d a,b,c,d,问有多少对 ( x , y ) ( x ∈ [ a , b ] , y ∈ [ c , d ] ) (x,y)(x∈[a,b],y∈[c,d]) (x,y)(x∈[a,b],y∈[c,d])使得 x ∗ y x*y x∗y是2018的倍数
思路:
1.2018的倍数可以是
2018
∗
n
2018*n
2018∗n(n为正整数)
num1为区间
[
a
,
b
]
[a,b]
[a,b]里
2018
2018
2018的倍数的个数,
num1中的任意一个数和区间[c,d]里的数相乘都是2018的倍数,num2同理
∴
a
n
s
+
=
n
u
m
1
∗
(
d
−
c
+
1
)
+
n
u
m
2
∗
(
b
−
a
+
1
)
−
n
u
m
1
∗
n
u
m
2
;
∴ans+=num1*(d-c+1)+num2*(b-a+1)-num1*num2;
∴ans+=num1∗(d−c+1)+num2∗(b−a+1)−num1∗num2;
∵
∵
∵区间
[
a
,
b
]
[a,b]
[a,b]里的2018的倍数和区间
[
c
,
d
]
[c,d]
[c,d]里的2018的倍数相乘被计算过两次,所以要减去
n
u
m
1
∗
n
u
m
2
num1*num2
num1∗num2
2.2018的倍数还可以是
1009
∗
n
1009*n
1009∗n(n为2的倍数)
1009的奇数倍,
此时
[
a
,
b
]
[a,b]
[a,b]中1009的奇数倍(偶数倍为2018的倍数,已经计算过,所以要减去num1)与
[
c
,
d
]
[c,d]
[c,d]中的偶数(这里偶数中的2018的倍数在第一种情况中计算过了,所以要减去num2)相乘都能组成2018的倍数,
[
c
,
d
]
[c,d]
[c,d]中1009的奇数倍和
[
a
,
b
]
[a,b]
[a,b]中的偶数相乘同理,相加即可
∴
a
n
s
+
=
(
b
/
1009
−
(
a
−
1
)
/
1009
−
n
u
m
1
)
∗
(
d
/
2
−
(
c
−
1
)
/
2
−
n
u
m
2
)
+
(
b
/
2
−
(
a
−
1
)
/
2
−
n
u
m
1
)
∗
(
d
/
1009
−
(
c
−
1
)
/
1009
−
n
u
m
2
)
;
∴ans+=(b/1009-(a-1)/1009-num1)*(d/2-(c-1)/2-num2)+(b/2-(a-1)/2-num1)*(d/1009-(c-1)/1009-num2);
∴ans+=(b/1009−(a−1)/1009−num1)∗(d/2−(c−1)/2−num2)+(b/2−(a−1)/2−num1)∗(d/1009−(c−1)/1009−num2);
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a,b,c,d;
int main() {
while(cin>>a>>b>>c>>d) {
ll num1=b/2018-(a-1)/2018,num2=d/2018-(c-1)/2018;
ll ans=num1*(d-c+1)+num2*(b-a+1)-num1*num2;
ans+=(b/2-(a-1)/2-num1)*(d/1009-(c-1)/1009-num2)+(b/1009-(a-1)/1009-num1)*(d/2-(c-1)/2-num2);
cout<<ans<<endl;
}
}