∑ i = 0 n ⌊ a i + b c ⌋ \sum_{i=0}^{n}\left \lfloor \frac{ai+b}{c} \right \rfloor ∑i=0n⌊cai+b⌋
如果a>=c
∑
i
=
0
n
⌊
a
i
+
b
c
⌋
=
⌊
a
c
⌋
n
(
n
+
1
)
2
+
∑
i
=
0
n
⌊
(
a
%
c
)
i
+
b
c
⌋
\sum_{i=0}^{n}\left \lfloor \frac{ai+b}{c} \right \rfloor=\left \lfloor \frac{a}{c} \right \rfloor\frac{n(n+1)}{2}+\sum_{i=0}^{n}\left \lfloor \frac{(a\%c)i+b}{c} \right \rfloor
∑i=0n⌊cai+b⌋=⌊ca⌋2n(n+1)+∑i=0n⌊c(a%c)i+b⌋
如果b>=c
∑
i
=
0
n
⌊
a
i
+
b
c
⌋
=
⌊
b
c
⌋
(
n
+
1
)
+
∑
i
=
0
n
⌊
a
i
+
b
%
c
c
⌋
\sum_{i=0}^{n}\left \lfloor \frac{ai+b}{c} \right \rfloor=\left \lfloor \frac{b}{c} \right \rfloor(n+1)+\sum_{i=0}^{n}\left \lfloor \frac{ai+b\%c}{c} \right \rfloor
∑i=0n⌊cai+b⌋=⌊cb⌋(n+1)+∑i=0n⌊cai+b%c⌋
然后现在我们有a<c,b<c
∑
i
=
0
n
⌊
a
i
+
b
c
⌋
\sum_{i=0}^{n}\left \lfloor \frac{ai+b}{c} \right \rfloor
∑i=0n⌊cai+b⌋
=
∑
i
=
0
n
∑
j
=
0
⌊
a
i
+
b
c
⌋
[
j
<
⌊
a
i
+
b
c
⌋
]
=\sum_{i=0}^{n}\sum_{j=0}^{\left \lfloor \frac{ai+b}{c} \right \rfloor}[j<\left \lfloor \frac{ai+b}{c} \right \rfloor]
=∑i=0n∑j=0⌊cai+b⌋[j<⌊cai+b⌋]
=
∑
i
=
0
n
∑
j
=
0
⌊
a
n
+
b
c
⌋
[
j
<
⌊
a
i
+
b
c
⌋
]
=\sum_{i=0}^{n}\sum_{j=0}^{\left \lfloor \frac{an+b}{c} \right \rfloor}[j<\left \lfloor \frac{ai+b}{c} \right \rfloor]
=∑i=0n∑j=0⌊can+b⌋[j<⌊cai+b⌋]
我们考虑
[
j
<
⌊
a
i
+
b
c
⌋
]
=
[
(
j
+
1
)
c
<
=
a
i
+
b
]
=
[
i
>
=
j
c
+
c
−
b
a
]
=
[
i
>
⌊
j
c
+
c
−
b
−
1
a
⌋
]
=
1
−
[
i
<
=
⌊
j
c
+
c
−
b
−
1
a
⌋
]
[j<\left \lfloor \frac{ai+b}{c} \right \rfloor]=[(j+1)c<=ai+b]=[i>=\frac{jc+c-b}{a}]=[i>\left \lfloor \frac{jc+c-b-1}{a} \right \rfloor]=1-[i<=\left \lfloor \frac{jc+c-b-1}{a} \right \rfloor]
[j<⌊cai+b⌋]=[(j+1)c<=ai+b]=[i>=ajc+c−b]=[i>⌊ajc+c−b−1⌋]=1−[i<=⌊ajc+c−b−1⌋]
所以上述式子可以表示为
=
n
⌊
a
n
+
b
c
⌋
−
∑
i
=
0
⌊
a
n
+
b
c
⌋
−
1
⌊
i
c
+
c
−
b
−
1
a
⌋
=n\left \lfloor \frac{an+b}{c} \right \rfloor-\sum_{i=0}^{\left \lfloor \frac{an+b}{c} \right \rfloor-1}\left \lfloor \frac{ic+c-b-1}{a} \right \rfloor
=n⌊can+b⌋−∑i=0⌊can+b⌋−1⌊aic+c−b−1⌋
我们设
f
(
a
,
b
,
c
,
n
)
=
∑
i
=
0
n
⌊
a
i
+
b
c
⌋
f(a,b,c,n)=\sum_{i=0}^{n}\left \lfloor \frac{ai+b}{c} \right \rfloor
f(a,b,c,n)=∑i=0n⌊cai+b⌋
那么我们有
f
(
a
,
b
,
c
,
n
)
=
f
(
a
%
c
,
b
%
c
,
c
,
n
)
+
⌊
a
c
⌋
n
(
n
+
1
)
2
+
⌊
b
c
⌋
(
n
+
1
)
f(a,b,c,n)=f(a\%c,b\%c,c,n)+\left \lfloor \frac{a}{c} \right \rfloor\frac{n(n+1)}{2}+\left \lfloor \frac{b}{c} \right \rfloor(n+1)
f(a,b,c,n)=f(a%c,b%c,c,n)+⌊ca⌋2n(n+1)+⌊cb⌋(n+1)
f
(
a
,
b
,
c
,
n
)
=
n
⌊
a
n
+
b
c
⌋
−
f
(
c
,
c
−
b
−
1
,
a
,
⌊
a
n
+
b
c
⌋
−
1
)
f(a,b,c,n)=n\left \lfloor \frac{an+b}{c} \right \rfloor-f(c,c-b-1,a,\left \lfloor \frac{an+b}{c} \right \rfloor-1)
f(a,b,c,n)=n⌊can+b⌋−f(c,c−b−1,a,⌊can+b⌋−1)
然后我们递归处理,时间复杂度一个log,时间复杂度分析可以参照欧几里得辗转相除
ll get_la(ll a,ll b,ll c,ll n){
if (a==0) return (n+1)*(b/c);
if (a>=c||b>=c) return (a/c)*(1+n)*n/2+(b/c)*(n+1)+get_la(a%c,b%c,c,n);
return (a*n+b)/c*n-get_la(c,c-b-1,a,(a*n+b)/c-1);
}
剩余的先咕着