题目链接:https://codeforces.com/problemset/problem/1389/E
分析
根据所给条件,可以写出:
(
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)
进一步推出:
(
x
−
y
)
(
d
−
1
)
≡
0
(
m
o
d
w
)
(x-y)(d-1)\equiv 0\ (mod\ w)
(x−y)(d−1)≡0 (mod w)
得到:
(
x
−
y
)
(
d
−
1
)
+
k
w
=
0
(
k
∈
R
)
(x-y)(d-1) + kw=0\ (k\in R)
(x−y)(d−1)+kw=0 (k∈R)
那么
(
x
−
y
)
(x-y)
(x−y)就是
l
c
m
(
d
−
1
,
w
)
/
(
d
−
1
)
lcm(d-1,w)/(d-1)
lcm(d−1,w)/(d−1)的倍数。
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
#define fi first
#define se second
#define lson (k << 1)
#define rson (k << 1 | 1)
const int INF = 0x3f3f3f3f;
const int N = 1e6 + 10;
const int M = 1e6 + 10;
const ll P = 1e9 + 7;
ll m, d, w;
int main() {
int T = 1;
scanf("%d",&T);
for(int t=1;t<=T;t++)
{
scanf("%lld%lld%lld",&m,&d,&w);
if(m == 1 || d == 1)
{
printf("0\n");
continue;
}
ll f = (d - 1) * w / __gcd(d - 1, w) / (d - 1);
ll x = min(m, d);
if(x - f < 0) printf("0\n");
else printf("%lld\n",(x - f + x - (x - 1) / f * f) * ((x - 1) / f) / 2);
}
return 0;
}