洛谷传送门 & CF 传送门
思路
我们设 a=px+p2x+p3x+…+p⌊xn⌋⋅x,设 alen=⌊xn⌋;设 b=py+p2y+…+p⌊yn⌋⋅y,设 blen=⌊yn⌋;设 g 为 a 和 b 中的公共部分,设 glen=lcm(x,y)n。去掉公共部分的 glen 个元素,alen 变成了 alen−glen,blen 就变成了 blen−glen。我们要让 a−b 最大,则要把 a 设为最大的 n∼(n−alen+1) 最小,b 设为最小的 1∼(n−blen),g 部分随便设。根据等差数列求和公式,a 的总和是 2(n×2−alen+1)×alen,b 的总和是 2(blen+1)×blen,答案就是 2(n×2−alen+1)×alen−(blen+1)×blen。记得开 long long。
代码
# include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll t, a, b, g, n;
int main () {
cin >> t;
while (t --) {
cin >> n >> a >> b;
g = a * b / __gcd (a, b);
a = n / a, b = n / b, g = n / g;
a -= g, b -= g;
cout << ((n * 2 - a + 1) * a - (b + 1) * b) / 2 << '\n';
}
return 0;
}