题目链接
题意:
一年有m个月,每月有d天,每周有w天,每年的第一天都是周一,问有多少对x,y(x<y),在x月的y天和y月的x天是一周中的同一天。
思路
x与y的关系公式:
(
x
−
1
)
∗
d
+
y
≡
(
y
−
1
)
∗
d
+
x
(
m
o
d
w
)
(x-1)*d+y\equiv(y-1)*d+x\ (mod\ w)
(x−1)∗d+y≡(y−1)∗d+x (mod w)
(
y
−
x
)
∗
(
d
−
1
)
≡
0
(
m
o
d
w
)
(y-x)*(d-1)\equiv0\ (mod\ w)
(y−x)∗(d−1)≡0 (mod w)
等式左边需同时为
d
−
1
d-1
d−1 和
w
w
w 的倍数,即为
L
C
M
(
d
−
1
,
w
)
LCM(d-1,w)
LCM(d−1,w)的倍数,范围在
(
1
,
m
i
n
(
m
,
d
)
)
(1,min(m,d))
(1,min(m,d))内。
则
y
−
x
y-x
y−x 为
w
/
g
c
d
(
w
,
d
−
1
)
w/gcd(w,d-1)
w/gcd(w,d−1) 的倍数,设
g
=
w
/
g
c
d
(
w
,
d
−
1
)
g=w/gcd(w,d-1)
g=w/gcd(w,d−1) ,
y
−
x
=
k
∗
g
(
k
∈
(
1
,
⌊
m
i
n
(
m
,
d
)
/
g
)
⌋
)
)
y-x=k*g\ \ (k\in(1,\lfloor min(m,d)/g) \rfloor))
y−x=k∗g (k∈(1,⌊min(m,d)/g)⌋))。等差数列求和即可。
#include<bits/stdc++.h>
#define ll long long
#define LL long long
#define PB push_back
#define MP make_pair
using namespace std;
const int maxn=2e5+100;
const ll inf=1e18+10;
int main(){
int t;
cin>>t;
while(t--){
ll m,w,d;
cin>>m>>d>>w;
m=min(m,d);
ll g=w/__gcd(w,(d-1));
ll num=m/g;
ll ans=num*m-num*(g+num*g)/2;
cout<<ans<<endl;
}
return 0;
}