Sol
设
n
=
⌊
c
a
⌋
n=\lfloor\frac{c}{a}\rfloor
n=⌊ac⌋
问题转化为求
∑
i
=
0
n
⌊
c
−
a
x
b
⌋
+
1
=
∑
i
=
0
n
⌊
−
a
x
+
b
+
c
b
⌋
\sum_{i=0}^{n}\lfloor\frac{c-ax}{b}\rfloor+1=\sum_{i=0}^{n}\lfloor\frac{-ax+b+c}{b}\rfloor
i=0∑n⌊bc−ax⌋+1=i=0∑n⌊b−ax+b+c⌋
考虑一般性的问题
设
f
(
a
,
b
,
c
,
n
)
=
∑
i
=
0
n
⌊
a
x
+
b
c
⌋
,
c
≠
0
f(a,b,c,n)=\sum_{i=0}^{n}\lfloor\frac{ax+b}{c}\rfloor,c\ne 0
f(a,b,c,n)=i=0∑n⌊cax+b⌋,c̸=0
- 若 c ≤ 0 c\le 0 c≤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
<
0
a<0
a<0 或
b
<
0
b<0
b<0,那么
f ( a , b , c , n ) = f ( a m o d c + c , b m o d c + c , c , n ) + n ( n + 1 ) 2 ( ⌊ a c ⌋ − 1 ) + ( n + 1 ) ( ⌊ b c ⌋ − 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
>
=
c
a>=c
a>=c 或
b
>
=
c
b>=c
b>=c,那么
f ( a , b , c , n ) = f ( a m o d c , b m o d c , c , n ) + n ( n + 1 ) 2 ⌊ a c ⌋ + ( n + 1 ) ⌊ b c ⌋ 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}\rfloor f(a,b,c,n)=f(a mod c,b mod c,c,n)+2n(n+1)⌊ca⌋+(n+1)⌊cb⌋ - 最后
0
≤
a
<
c
0\le a<c
0≤a<c 且
0
≤
b
<
c
0\le b<c
0≤b<c
设 m = ⌊ a n + b c ⌋ m=\lfloor\frac{an+b}{c}\rfloor m=⌊can+b⌋
那么
∑ i = 0 n ⌊ a i + b c ⌋ = ∑ i = 0 n ∑ j = 1 m [ ⌊ a i + b c ⌋ ≥ j ] = ∑ i = 0 n ∑ j = 0 m − 1 [ ⌊ a i + b c ⌋ ≥ 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 = 0 n ∑ j = 0 m − 1 [ a i ≥ c j + c − b ] = ∑ i = 0 n ∑ j = 0 m − 1 [ a i > c j + 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 = 0 n ∑ j = 0 m − 1 [ i > ⌊ c j + c − b − 1 a ⌋ ] = ∑ i = 0 m − 1 ( n − ⌊ c i + c − b − 1 a ⌋ ) =\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⌋)
= n m − ∑ i = 0 m − 1 ⌊ c i + c − b − 1 a ⌋ = n m − 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 = 0 a=0 a=0 或者 n ≤ 1 n\le 1 n≤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;
}