给定
n
,
a
,
b
,
c
n,a,b,c
n,a,b,c,求
∑
i
=
0
n
⌊
a
i
+
b
c
⌋
∑
i
=
0
n
⌊
a
i
+
b
c
⌋
2
∑
i
=
0
n
i
⌊
a
i
+
b
c
⌋
\sum_{i=0}^n\Big\lfloor \frac{ai+b}{c} \Big\rfloor \\ \sum_{i=0}^n\Big\lfloor \frac{ai+b}{c} \Big\rfloor^2 \\ \sum_{i=0}^n i\Big\lfloor \frac{ai+b}{c} \Big\rfloor \\
i=0∑n⌊cai+b⌋i=0∑n⌊cai+b⌋2i=0∑ni⌊cai+b⌋
样例数
1
≤
T
≤
1
0
5
1\le T\le 10^5
1≤T≤105
0
≤
n
,
a
,
b
,
c
≤
1
0
9
0\le n,a,b,c\le 10^9
0≤n,a,b,c≤109
记号
我们记一下这三个函数:
f
(
a
,
b
,
c
,
n
)
=
∑
i
=
0
n
⌊
a
i
+
b
c
⌋
h
(
a
,
b
,
c
,
n
)
=
∑
i
=
0
n
⌊
a
i
+
b
c
⌋
2
g
(
a
,
b
,
c
,
n
)
=
∑
i
=
0
n
i
⌊
a
i
+
b
c
⌋
f(a,b,c,n)=\sum_{i=0}^n\Big\lfloor \frac{ai+b}{c} \Big\rfloor\\ h(a,b,c,n)=\sum_{i=0}^n\Big\lfloor \frac{ai+b}{c} \Big\rfloor^2\\ g(a,b,c,n)=\sum_{i=0}^n i\Big\lfloor \frac{ai+b}{c} \Big\rfloor \\
f(a,b,c,n)=i=0∑n⌊cai+b⌋h(a,b,c,n)=i=0∑n⌊cai+b⌋2g(a,b,c,n)=i=0∑ni⌊cai+b⌋
f
(
a
,
b
,
c
,
n
)
f(a,b,c,n)
f(a,b,c,n) 的推导
当
a
≥
c
a\ge c
a≥c 或
b
≥
c
b \ge c
b≥c 时,我们有
f
(
a
,
b
,
c
,
n
)
=
∑
i
=
0
n
⌊
(
a
−
a
m
o
d
c
)
∗
i
+
(
a
m
o
d
c
)
∗
i
+
b
c
⌋
=
f
(
a
%
c
,
b
%
c
,
c
,
n
)
+
n
(
n
+
1
)
2
⌊
a
c
⌋
+
(
n
+
1
)
⌊
b
c
⌋
\begin{aligned} f(a,b,c,n)&=\sum_{i=0}^n \Big \lfloor \frac{(a - a \bmod c)*i + (a \bmod c) * i + b}{c} \Big \rfloor\\ &=f(a\%c,b\%c,c,n)+\frac{n(n+1)}{2} \lfloor\frac{a}{c}\rfloor + (n+1)\lfloor\frac{b}{c}\rfloor \end{aligned}
f(a,b,c,n)=i=0∑n⌊c(a−amodc)∗i+(amodc)∗i+b⌋=f(a%c,b%c,c,n)+2n(n+1)⌊ca⌋+(n+1)⌊cb⌋
当
a
<
c
a < c
a<c 且
b
<
c
b < c
b<c 时,设
m
=
⌊
a
n
+
b
c
⌋
m=\lfloor\frac{an+b}{c}\rfloor
m=⌊can+b⌋
f
(
a
,
b
,
c
,
n
)
=
∑
i
=
0
n
∑
j
=
1
m
[
⌊
a
i
+
b
c
⌋
≥
j
]
=
∑
i
=
0
n
∑
j
=
0
m
−
1
[
⌊
a
i
+
b
c
⌋
≥
j
+
1
]
=
∑
i
=
0
n
∑
j
=
0
m
−
1
[
i
>
j
c
+
c
−
b
−
1
a
]
=
∑
j
=
0
m
−
1
n
−
⌊
j
c
+
c
−
b
−
1
a
⌋
=
n
m
−
f
(
c
,
c
−
b
−
1
,
a
,
m
−
1
)
\begin{aligned} f(a,b,c,n)&=\sum_{i=0}^n\sum_{j=1}^m\Big[ \lfloor \frac{ai+b}{c} \rfloor \ge j\Big]\\ &=\sum_{i=0}^n\sum_{j=0}^{m-1}\Big[ \lfloor \frac{ai+b}{c} \rfloor \ge j+1\Big]\\ &=\sum_{i=0}^n\sum_{j=0}^{m-1}\Big[ i > \frac{jc+c-b-1}{a}\Big]\\ &=\sum_{j=0}^{m-1}n-\Big\lfloor \frac{jc+c-b-1}{a} \Big\rfloor\\ &=nm-f(c,c-b-1,a,m-1) \end{aligned}
f(a,b,c,n)=i=0∑nj=1∑m[⌊cai+b⌋≥j]=i=0∑nj=0∑m−1[⌊cai+b⌋≥j+1]=i=0∑nj=0∑m−1[i>ajc+c−b−1]=j=0∑m−1n−⌊ajc+c−b−1⌋=nm−f(c,c−b−1,a,m−1) 边界条件
a
=
0
a=0
a=0
g
(
a
,
b
,
c
,
n
)
g(a,b,c,n)
g(a,b,c,n) 的式子
当
a
≥
c
a\ge c
a≥c 或
b
≥
c
b \ge c
b≥c 时,有
g
(
a
,
b
,
c
,
n
)
=
g
(
a
%
c
,
b
%
c
,
c
,
n
)
+
n
(
n
+
1
)
(
2
n
+
1
)
/
6
⌊
a
c
⌋
+
n
(
n
+
1
)
/
2
⌊
b
c
⌋
\begin{aligned} g(a,b,c,n)&=g(a\%c,b\%c,c,n)+n(n+1)(2n+1)/6 \lfloor\frac{a}{c}\rfloor\\ &+n(n+1)/2 \lfloor\frac{b}{c}\rfloor \end{aligned}
g(a,b,c,n)=g(a%c,b%c,c,n)+n(n+1)(2n+1)/6⌊ca⌋+n(n+1)/2⌊cb⌋
当
a
<
c
a < c
a<c 且
b
<
c
b < c
b<c 时,有
g
(
a
,
b
,
c
,
n
)
=
m
n
(
n
+
1
)
−
f
(
c
,
c
−
b
−
1
,
a
,
m
−
1
)
−
h
(
c
,
c
−
b
−
a
,
a
,
m
−
1
)
2
\begin{aligned} g(a,b,c,n)&=\frac{mn(n+1)-f(c,c-b-1,a,m-1)-h(c,c-b-a,a,m-1)}{2} \end{aligned}
g(a,b,c,n)=2mn(n+1)−f(c,c−b−1,a,m−1)−h(c,c−b−a,a,m−1)
h
(
a
,
b
,
c
,
n
)
h(a,b,c,n)
h(a,b,c,n) 的式子
当
a
≥
c
a\ge c
a≥c 或
b
≥
c
b \ge c
b≥c 时,得到:
h
(
a
,
b
,
c
,
n
)
=
h
(
a
%
c
,
b
%
c
,
c
,
n
)
+
n
(
n
+
1
)
(
2
n
+
1
)
6
⌊
a
c
⌋
2
+
2
⌊
b
c
⌋
f
(
a
%
c
,
b
%
c
,
c
,
n
)
+
2
⌊
a
c
⌋
g
(
a
%
c
,
b
%
c
,
c
,
n
)
+
⌊
a
c
⌋
⌊
b
c
⌋
n
(
n
+
1
)
+
⌊
b
c
⌋
2
(
n
+
1
)
\begin{aligned} h(a,b,c,n)&=h(a\%c,b\%c,c,n)+\frac{n(n+1)(2n+1)}{6}\lfloor\frac{a}{c}\rfloor^2\\ &+2\lfloor\frac{b}{c}\rfloor f(a\%c,b\%c,c,n)\\ &+2\lfloor\frac{a}{c}\rfloor g(a\%c,b\%c,c,n)\\ &+\lfloor\frac{a}{c}\rfloor\lfloor\frac{b}{c}\rfloor n(n+1)\\ &+\lfloor\frac{b}{c}\rfloor^2(n+1) \end{aligned}
h(a,b,c,n)=h(a%c,b%c,c,n)+6n(n+1)(2n+1)⌊ca⌋2+2⌊cb⌋f(a%c,b%c,c,n)+2⌊ca⌋g(a%c,b%c,c,n)+⌊ca⌋⌊cb⌋n(n+1)+⌊cb⌋2(n+1)
当
a
<
c
a < c
a<c 且
b
<
c
b < c
b<c 时
h
(
a
,
b
,
c
,
n
)
=
m
(
m
+
1
)
n
−
2
g
(
c
,
c
−
b
−
1
,
a
,
m
−
1
)
−
2
f
(
c
,
c
−
b
−
1
,
a
,
m
−
1
)
−
f
(
a
,
b
,
c
,
n
)
\begin{aligned} h(a,b,c,n)&=m(m+1)n-2g(c,c-b-1,a,m-1)\\ &-2f(c,c-b-1,a,m-1)\\ &-f(a,b,c,n) \end{aligned}
h(a,b,c,n)=m(m+1)n−2g(c,c−b−1,a,m−1)−2f(c,c−b−1,a,m−1)−f(a,b,c,n)
回到题目上来
然后把式子一放,总能过了吧?
ll f(ll,ll,ll,ll);// floor[ (ai+b)/c ]
ll g(ll,ll,ll,ll);// i floor[ (ai+b)/c ]
ll h(ll,ll,ll,ll);// [ floor[ (ai+b)/c ] ]^2
ll f(ll a,ll b,ll c,ll n){if(a ==0)return(n +1)*(b / c)% MOD;if(a >= c || b >= c){return(f(a%c,b%c,c,n)+ n *(n +1)% MOD * iv2 % MOD *(a / c)+(n +1)*(b / c)% MOD)% MOD;}else{
ll m =(a * n + b)/ c;return(n * m % MOD -f(c,c-b-1,a,m-1)+ MOD)% MOD;}}
ll g(ll a,ll b,ll c,ll n){if(a ==0)return n *(n +1)% MOD * iv2 % MOD *(b/c)% MOD;if(n ==0)return0;if(a >= c || b >= c){return(g(a%c,b%c,c,n)+ n *(n +1)% MOD *(2*n+1)% MOD * iv6 % MOD *(a/c)% MOD + n *(n +1)% MOD * iv2 % MOD *(b/c)% MOD )% MOD;}else{
ll m =(a * n + b)/ c;return(n * m % MOD *(n +1)% MOD -f(c,c-b-1,a,m-1)-h(c,c-b-1,a,m-1)+2* MOD)% MOD * iv2 % MOD;}}
ll h(ll a,ll b,ll c,ll n){if(a ==0)return(n+1)*(b/c)% MOD *(b/c)% MOD;if(n ==0)return(b/c)*(b/c)% MOD;if(a >= c || b >= c){return(h(a%c,b%c,c,n)+ n *(n +1)% MOD *(2*n+1)% MOD * iv6 % MOD *(a/c)% MOD *(a/c)% MOD +2*(b / c)% MOD *f(a%c,b%c,c,n)% MOD +2*(a / c)% MOD *g(a%c,b%c,c,n)% MOD +(a/c)*(b/c)% MOD * n % MOD *(n+1)% MOD +(b/c)*(b/c)% MOD *(n +1)% MOD )% MOD;}else{
ll m =(a * n + b)/ c;return(n * m % MOD *(m +1)% MOD -2*g(c,c-b-1,a,m-1)-2*f(c,c-b-1,a,m-1)-f(a,b,c,n))% MOD;}}
结果不大行,都
T
L
E
\color{red}TLE
TLE 了,得优化一下 我们用一个结构体去存
Q
u
e
r
y
{
F
,
G
,
H
}
Query\{F,G,H\}
Query{F,G,H} 表示目前的
f
(
a
,
b
,
c
,
n
)
,
g
(
a
,
b
,
c
,
n
)
,
h
(
a
,
b
,
c
,
n
)
f(a,b,c,n),g(a,b,c,n),h(a,b,c,n)
f(a,b,c,n),g(a,b,c,n),h(a,b,c,n) 的值 然后就变成了这样: 时间复杂度:
O
(
T
log
n
)
O(T\log n)
O(Tlogn)
struct Query{
ll f,g,h;};
Query solve(ll a,ll b,ll c,ll n){
Query ans,tmp;if(a ==0){
ans.f =(n +1)*(b / c)% MOD;
ans.g = n *(n +1)% MOD * iv2 % MOD *(b/c)% MOD;
ans.h =(n+1)*(b/c)% MOD *(b/c)% MOD;return ans;}if(a >= c || b >= c){
tmp =solve(a % c,b % c,c,n);
ans.f =(tmp.f +(a / c)* n % MOD *(n +1)% MOD * iv2 % MOD +(b / c)*(n +1)% MOD)% MOD;
ans.g =(tmp.g +(a / c)* n % MOD *(n +1)% MOD *(2* n +1)% MOD * iv6 % MOD +(b / c)* n % MOD *(n +1)% MOD * iv2 % MOD)% MOD;
ans.h =((a / c)*(a / c)% MOD * n % MOD *(n +1)% MOD *(2* n +1)% MOD * iv6 % MOD +(b / c)*(b / c)% MOD *(n +1)% MOD +(a / c)*(b / c)% MOD * n % MOD *(n +1)% MOD +
tmp.h +2*(a / c)% MOD * tmp.g % MOD +2*(b / c)% MOD * tmp.f % MOD)% MOD;return ans;}
ll m =(a * n + b)/ c;
tmp =solve(c,c-b-1,a,m-1);
ans.f =(n *(m % MOD)% MOD - tmp.f)% MOD;
ans.g =(n *(n +1)% MOD *(m % MOD)% MOD - tmp.f - tmp.h)% MOD * iv2 % MOD;
ans.h =(n *(m % MOD)% MOD *((m +1)% MOD)% MOD -2* tmp.g -2* tmp.f - ans.f)% MOD;return ans;}