Sol
设 n=⌊ca⌋n=\lfloor\frac{c}{a}\rfloorn=⌊ac⌋
问题转化为求
∑i=0n⌊c−axb⌋+1=∑i=0n⌊−ax+b+cb⌋\sum_{i=0}^{n}\lfloor\frac{c-ax}{b}\rfloor+1=\sum_{i=0}^{n}\lfloor\frac{-ax+b+c}{b}\rfloori=0∑n⌊bc−ax⌋+1=i=0∑n⌊b−ax+b+c⌋
考虑一般性的问题
设
f(a,b,c,n)=∑i=0n⌊ax+bc⌋,c≠0f(a,b,c,n)=\sum_{i=0}^{n}\lfloor\frac{ax+b}{c}\rfloor,c\ne 0f(a,b,c,n)=i=0∑n⌊cax+b⌋,c̸=0
- 若 c≤0c\le 0c≤0,那么 f(a,b,c,n)=f(−a,−b,−c,n)f(a,b,c,n)=f(-a,-b,-c,n)f(a,b,c,n)=f(−a,−b,−c,n)
- 若 a<0a<0a<0 或 b<0b<0b<0,那么
f(a,b,c,n)=f(a mod c+c,b mod c+c,c,n)+n(n+1)2(⌊ac⌋−1)+(n+1)(⌊bc⌋−1)f(a,b,c,n)=f(a~mod~c + c, b~mod~c + c, c, n) + \frac{n(n + 1)}{2} (\lfloor\frac{a}{c}\rfloor - 1) + (n + 1)(\lfloor\frac{b}{c}\rfloor - 1)f(a,b,c,n)=f(a mod c+c,b mod c+c,c,n)+2n(n+1)(⌊ca⌋−1)+(n+1)(⌊cb⌋−1) - 若 a>=ca>=ca>=c 或 b>=cb>=cb>=c,那么
f(a,b,c,n)=f(a mod c,b mod c,c,n)+n(n+1)2⌊ac⌋+(n+1)⌊bc⌋f(a,b,c,n)=f(a~mod~c, b~mod~c, c, n) + \frac{n(n + 1)}{2}\lfloor\frac{a}{c}\rfloor + (n + 1)\lfloor\frac{b}{c}\rfloorf(a,b,c,n)=f(a mod c,b mod c,c,n)+2n(n+1)⌊ca⌋+(n+1)⌊cb⌋ - 最后 0≤a<c0\le a<c0≤a<c 且 0≤b<c0\le b<c0≤b<c
设 m=⌊an+bc⌋m=\lfloor\frac{an+b}{c}\rfloorm=⌊can+b⌋
那么
∑i=0n⌊ai+bc⌋=∑i=0n∑j=1m[⌊ai+bc⌋≥j]=∑i=0n∑j=0m−1[⌊ai+bc⌋≥j+1]\sum_{i=0}^{n}\lfloor\frac{ai+b}{c}\rfloor=\sum_{i=0}^{n}\sum_{j=1}^{m}[\lfloor\frac{ai+b}{c}\rfloor\ge j]=\sum_{i=0}^{n}\sum_{j=0}^{m-1}[\lfloor\frac{ai+b}{c}\rfloor\ge j+1]i=0∑n⌊cai+b⌋=i=0∑nj=1∑m[⌊cai+b⌋≥j]=i=0∑nj=0∑m−1[⌊cai+b⌋≥j+1]
=∑i=0n∑j=0m−1[ai≥cj+c−b]=∑i=0n∑j=0m−1[ai>cj+c−b−1]=\sum_{i=0}^{n}\sum_{j=0}^{m-1}[ai\ge cj+c-b]=\sum_{i=0}^{n}\sum_{j=0}^{m-1}[ai> cj+c-b-1]=i=0∑nj=0∑m−1[ai≥cj+c−b]=i=0∑nj=0∑m−1[ai>cj+c−b−1]
=∑i=0n∑j=0m−1[i>⌊cj+c−b−1a⌋]=∑i=0m−1(n−⌊ci+c−b−1a⌋)=\sum_{i=0}^{n}\sum_{j=0}^{m-1}[i> \lfloor\frac{cj+c-b-1}{a}\rfloor]=\sum_{i=0}^{m-1}(n-\lfloor\frac{ci+c-b-1}{a}\rfloor)=i=0∑nj=0∑m−1[i>⌊acj+c−b−1⌋]=i=0∑m−1(n−⌊aci+c−b−1⌋)
=nm−∑i=0m−1⌊ci+c−b−1a⌋=nm−f(c,c−b−a,a,m−1)=nm-\sum_{i=0}^{m-1}\lfloor\frac{ci+c-b-1}{a}\rfloor=nm-f(c,c-b-a,a,m-1)=nm−i=0∑m−1⌊aci+c−b−1⌋=nm−f(c,c−b−a,a,m−1)
边界是 a=0a=0a=0 或者 n≤1n\le 1n≤1
这个题直接代入就好了
# include <bits/stdc++.h>
using namespace std;
typedef long long ll;
inline ll Gcd(ll x, ll y) {
if (!x || !y) return x + y;
return !y ? x : Gcd(y, x % y);
}
inline ll Solve(ll a, ll b, ll c, ll n) {
if (!a) return (n + 1) * (b / c);
if (!n) return b / c;
if (n == 1) return (a + b) / c + b / c;
if (c < 0) return Solve(-a, -b, -c, n);
register ll d = abs(Gcd(Gcd(a, b), c));
a /= d, b /= d, c /= d;
if (a >= c || b >= c) return Solve(a % c, b % c, c, n) + n * (n + 1) / 2 * (a / c) + (n + 1) * (b / c);
if (a < 0 || b < 0) return Solve(a % c + c, b % c + c, c, n) + n * (n + 1) / 2 * (a / c - 1) + (n + 1) * (b / c - 1);
register ll m = (a * n + b) / c;
return n * m - Solve(c, c - b - 1, a, m - 1);
}
ll a, b, c, n;
int main() {
scanf("%lld%lld%lld", &a, &b, &c), n = c / a;
printf("%lld\n", Solve(-a, c + b, b, n));
return 0;
}