设
f ( a , b , c , n ) = ∑ i = 0 n ⌊ a i + b c ⌋ g ( a , b , c , n ) = ∑ i = 0 n ⌊ a i + b c ⌋ 2 h ( a , b , c , n ) = ∑ i = 0 n i ⌊ a i + b c ⌋ f(a,b,c,n)=\sum_{i=0}^n\left\lfloor\frac{ai+b}{c}\right\rfloor\\ g(a,b,c,n)=\sum_{i=0}^n\left\lfloor\frac{ai+b}{c}\right\rfloor^2\\ h(a,b,c,n)=\sum_{i=0}^ni\left\lfloor\frac{ai+b}{c}\right\rfloor f(a,b,c,n)=i=0∑n⌊cai+b⌋g(a,b,c,n)=i=0∑n⌊cai+b⌋2h(a,b,c,n)=i=0∑ni⌊cai+b⌋
- 当 a = 0 a=0 a=0
f ( a , b , c , n ) = ( n + 1 ) ⌊ b c ⌋ g ( a , b , c , n ) = ( n + 1 ) ⌊ b c ⌋ 2 h ( a , b , c , n ) = n ( n + 1 ) 2 ⌊ b c ⌋ f(a,b,c,n)=(n+1)\left\lfloor\frac{b}{c}\right\rfloor\\ g(a,b,c,n)=(n+1)\left\lfloor\frac{b}{c}\right\rfloor^2\\ h(a,b,c,n)=\frac{n(n+1)}2\left\lfloor\frac{b}{c}\right\rfloor f(a,b,c,n)=(n+1)⌊cb⌋g(a,b,c,n)=(n+1)⌊cb⌋2h(a,b,c,n)=2n(n+1)⌊cb⌋
- 当 a ≥ c a\geq c a≥c 或 b ≥ c b\geq c b≥c
令 a ′ = a m o d c , b ′ = b m o d c a'=a\mod c,b'=b\mod c a′=amodc,b′=bmodc
f
(
a
,
b
,
c
,
n
)
=
∑
i
=
0
n
⌊
a
i
+
b
c
⌋
=
∑
i
=
0
n
(
⌊
a
c
⌋
i
+
⌊
b
c
⌋
+
⌊
a
′
i
+
b
′
c
⌋
)
=
n
(
n
+
1
)
2
⌊
a
c
⌋
+
(
n
+
1
)
⌊
b
c
⌋
+
f
(
a
′
,
b
′
,
c
,
n
)
f(a,b,c,n)=\sum_{i=0}^n\left\lfloor\frac{ai+b}{c}\right\rfloor\\ =\sum_{i=0}^n\left(\left\lfloor\frac{a}{c}\right\rfloor i+\left\lfloor\frac{b}{c}\right\rfloor+\left\lfloor\frac{a'i+b'}{c}\right\rfloor\right)\\ =\frac{n(n+1)}2\left\lfloor\frac{a}{c}\right\rfloor+\textcolor{red}{(n+1)}\left\lfloor\frac{b}{c}\right\rfloor+f(a',b',c,n)
f(a,b,c,n)=i=0∑n⌊cai+b⌋=i=0∑n(⌊ca⌋i+⌊cb⌋+⌊ca′i+b′⌋)=2n(n+1)⌊ca⌋+(n+1)⌊cb⌋+f(a′,b′,c,n)
g
(
a
,
b
,
c
,
n
)
=
∑
i
=
0
n
⌊
a
i
+
b
c
⌋
2
=
∑
i
=
0
n
(
⌊
a
c
⌋
i
+
⌊
b
c
⌋
+
⌊
a
′
i
+
b
′
c
⌋
)
2
=
∑
i
=
0
n
(
⌊
a
c
⌋
2
i
2
+
⌊
b
c
⌋
2
+
⌊
a
′
i
+
b
′
c
⌋
2
+
2
i
⌊
a
c
⌋
⌊
b
c
⌋
+
2
i
⌊
a
c
⌋
⌊
a
′
i
+
b
′
c
⌋
+
2
⌊
b
c
⌋
⌊
a
′
i
+
b
′
c
⌋
)
=
n
(
n
+
1
)
(
2
n
+
1
)
6
⌊
a
c
⌋
2
+
(
n
+
1
)
⌊
b
c
⌋
2
+
g
(
a
′
,
b
′
,
c
,
n
)
+
n
(
n
+
1
)
⌊
a
c
⌋
⌊
b
c
⌋
+
2
⌊
a
c
⌋
h
(
a
′
,
b
′
,
c
,
n
)
+
2
⌊
b
c
⌋
f
(
a
′
,
b
′
,
c
,
n
)
g(a,b,c,n)=\sum_{i=0}^n\left\lfloor\frac{ai+b}{c}\right\rfloor^2\\ =\sum_{i=0}^n\left(\left\lfloor\frac{a}{c}\right\rfloor i+\left\lfloor\frac{b}{c}\right\rfloor+\left\lfloor\frac{a'i+b'}{c}\right\rfloor\right)^2\\ =\sum_{i=0}^n\left(\left\lfloor\frac{a}{c}\right\rfloor^2i^2+\left\lfloor\frac{b}{c}\right\rfloor^2+\left\lfloor\frac{a'i+b'}{c}\right\rfloor^2+2i\left\lfloor\frac{a}{c}\right\rfloor\left\lfloor\frac{b}{c}\right\rfloor+2i\left\lfloor\frac{a}{c}\right\rfloor\left\lfloor\frac{a'i+b'}{c}\right\rfloor+2\left\lfloor\frac{b}{c}\right\rfloor\left\lfloor\frac{a'i+b'}{c}\right\rfloor \right)\\ =\frac{n(n+1)(2n+1)}{6}\left\lfloor\frac{a}{c}\right\rfloor^2+\textcolor{red}{(n+1)}\left\lfloor\frac{b}{c}\right\rfloor^2+g(a',b',c,n)+n(n+1)\left\lfloor\frac{a}{c}\right\rfloor\left\lfloor\frac{b}{c}\right\rfloor+2\left\lfloor\frac{a}{c}\right\rfloor h(a',b',c,n)+2\left\lfloor\frac{b}{c}\right\rfloor f(a',b',c,n)
g(a,b,c,n)=i=0∑n⌊cai+b⌋2=i=0∑n(⌊ca⌋i+⌊cb⌋+⌊ca′i+b′⌋)2=i=0∑n(⌊ca⌋2i2+⌊cb⌋2+⌊ca′i+b′⌋2+2i⌊ca⌋⌊cb⌋+2i⌊ca⌋⌊ca′i+b′⌋+2⌊cb⌋⌊ca′i+b′⌋)=6n(n+1)(2n+1)⌊ca⌋2+(n+1)⌊cb⌋2+g(a′,b′,c,n)+n(n+1)⌊ca⌋⌊cb⌋+2⌊ca⌋h(a′,b′,c,n)+2⌊cb⌋f(a′,b′,c,n)
h
(
a
,
b
,
c
,
n
)
=
∑
i
=
0
n
i
⌊
a
i
+
b
c
⌋
=
∑
i
=
0
n
i
(
⌊
a
c
⌋
i
+
⌊
b
c
⌋
+
⌊
a
′
i
+
b
′
c
⌋
)
=
n
(
n
+
1
)
(
2
n
+
1
)
6
⌊
a
c
⌋
+
n
(
n
+
1
)
2
⌊
b
c
⌋
+
h
(
a
′
,
b
′
,
c
,
n
)
h(a,b,c,n)=\sum_{i=0}^ni\left\lfloor\frac{ai+b}{c}\right\rfloor\\ =\sum_{i=0}^ni\left(\left\lfloor\frac{a}{c}\right\rfloor i+\left\lfloor\frac{b}{c}\right\rfloor+\left\lfloor\frac{a'i+b'}{c}\right\rfloor\right)\\ =\frac{n(n+1)(2n+1)}6 \left\lfloor\frac{a}{c}\right\rfloor+\frac {n(n+1)}2\left\lfloor\frac{b}{c}\right\rfloor+h(a',b',c,n)
h(a,b,c,n)=i=0∑ni⌊cai+b⌋=i=0∑ni(⌊ca⌋i+⌊cb⌋+⌊ca′i+b′⌋)=6n(n+1)(2n+1)⌊ca⌋+2n(n+1)⌊cb⌋+h(a′,b′,c,n)
- 当 a < c a<c a<c 且 b < c b<c b<c
令 m = ⌊ a n + b c ⌋ m=\left\lfloor\frac{an+b}{c}\right\rfloor m=⌊can+b⌋
f ( a , b , c , n ) = ∑ i = 0 n ⌊ a i + b c ⌋ = ∑ i = 0 n ∑ j = 1 m [ j ≤ ⌊ a i + b c ⌋ ] = ∑ i = 0 n ∑ j = 1 m [ j ≤ a i + b c ] = ∑ i = 0 n ∑ j = 1 m [ c j ≤ a i + b ] = ∑ i = 0 n ∑ j = 0 m − 1 [ c j + c ≤ a i + b ] = ∑ i = 0 n ∑ j = 0 m − 1 [ c j + c − 1 < a i + b ] = ∑ j = 0 m − 1 ∑ i = 0 n [ i > c j + c − b − 1 a ] = ∑ j = 0 m − 1 ( n + 1 − ∑ i = 0 n [ i ≤ c j + c − b − 1 a ] ) = ∑ j = 0 m − 1 ( n − ∑ i = 1 n [ i ≤ c j + c − b − 1 a ] ) = ∑ j = 0 m − 1 ( n − ⌊ c j + c − b − 1 a ⌋ ) = n m − f ( c , c − b − 1 , a , m − 1 ) f(a,b,c,n)=\sum_{i=0}^n\left\lfloor\frac{ai+b}{c}\right\rfloor\\ =\sum_{i=0}^n\sum_{\textcolor{red}{j=1}}^m\left[j\leq \left\lfloor\frac{ai+b}{c}\right\rfloor\right]\\ =\sum_{i=0}^n\sum_{j=1}^m\left[j\leq \frac{ai+b}{c}\right]\\ =\sum_{i=0}^n\sum_{j=1}^m\left[cj\leq ai+b\right]\\ =\sum_{i=0}^n\sum_{\textcolor{blue}{j=0}}^{\textcolor{blue}{m-1}}\left[cj+c\leq ai+b\right]\\ =\sum_{i=0}^n\sum_{j=0}^{m-1}\left[cj+c-1< ai+b\right]\\ =\sum_{j=0}^{m-1}\sum_{i=0}^n\left[i>\frac{cj+c-b-1}{a}\right]\\ =\sum_{j=0}^{m-1}\left(n+1-\sum_{i=\textcolor{red}0}^n\left[i\leq \frac{cj+c-b-1}{a}\right]\right)\\ =\sum_{j=0}^{m-1}\left(n-\sum_{i=\textcolor{blue}1}^n\left[i\leq \frac{cj+c-b-1}{a}\right]\right)\\ =\sum_{j=0}^{m-1}\left(n-\left\lfloor\frac{cj+c-b-1}{a}\right\rfloor\right)\\ =nm-f(c,c-b-1,a,m-1) f(a,b,c,n)=i=0∑n⌊cai+b⌋=i=0∑nj=1∑m[j≤⌊cai+b⌋]=i=0∑nj=1∑m[j≤cai+b]=i=0∑nj=1∑m[cj≤ai+b]=i=0∑nj=0∑m−1[cj+c≤ai+b]=i=0∑nj=0∑m−1[cj+c−1<ai+b]=j=0∑m−1i=0∑n[i>acj+c−b−1]=j=0∑m−1(n+1−i=0∑n[i≤acj+c−b−1])=j=0∑m−1(n−i=1∑n[i≤acj+c−b−1])=j=0∑m−1(n−⌊acj+c−b−1⌋)=nm−f(c,c−b−1,a,m−1)
剩下两个主体类似,故略去了一些中间步骤。
首先有: n 2 = 2 ∑ i = 1 n i − n n^2=2\sum_{i=1}^n i-n n2=2∑i=1ni−n
g ( a , b , c , n ) = ∑ i = 0 n ⌊ a i + b c ⌋ 2 = ∑ i = 0 n ( 2 ∑ j = 1 m [ j ≤ ⌊ a i + b c ⌋ ] j − ⌊ a i + b c ⌋ ) = 2 ∑ i = 0 n ∑ j = 0 m − 1 [ c j + c − 1 < a i + b ] ( j + 1 ) − f ( a , b , c , n ) = 2 ∑ j = 0 m − 1 ( j + 1 ) ( ∑ i = 0 n [ i > c j + c − b − 1 a ] ) − f ( a , b , c , n ) = 2 ∑ j = 0 m − 1 ( j + 1 ) ( n − ⌊ c j + c − b − 1 a ⌋ ) − f ( a , b , c , n ) = n m ( m + 1 ) − 2 h ( c , c − b − 1 , a , m − 1 ) − 2 f ( c , c − b − 1 , a , m − 1 ) − f ( a , b , c , n ) g(a,b,c,n)=\sum_{i=0}^n\left\lfloor\frac{ai+b}{c}\right\rfloor^2\\ =\sum_{i=0}^n\left(2\sum_{j=1}^m\left[j\leq \left\lfloor\frac{ai+b}{c}\right\rfloor\right]j-\left\lfloor\frac{ai+b}{c}\right\rfloor\right)\\ =2\sum_{i=0}^n\sum_{j=0}^{m-1}\left[cj+c-1<ai+b\right]\textcolor{red}{(j+1)}-f(a,b,c,n)\\ =2\sum_{j=0}^{m-1}(j+1)\left(\sum_{i=0}^n\left[i>\frac{cj+c-b-1}{a}\right]\right)-f(a,b,c,n)\\ =2\sum_{j=0}^{m-1}(j+1)\left(n-\left\lfloor\frac{cj+c-b-1}{a}\right\rfloor\right)-f(a,b,c,n)\\ =nm(m+1)-2h(c,c-b-1,a,m-1)-2f(c,c-b-1,a,m-1)-f(a,b,c,n) g(a,b,c,n)=i=0∑n⌊cai+b⌋2=i=0∑n(2j=1∑m[j≤⌊cai+b⌋]j−⌊cai+b⌋)=2i=0∑nj=0∑m−1[cj+c−1<ai+b](j+1)−f(a,b,c,n)=2j=0∑m−1(j+1)(i=0∑n[i>acj+c−b−1])−f(a,b,c,n)=2j=0∑m−1(j+1)(n−⌊acj+c−b−1⌋)−f(a,b,c,n)=nm(m+1)−2h(c,c−b−1,a,m−1)−2f(c,c−b−1,a,m−1)−f(a,b,c,n)
h ( a , b , c , n ) = ∑ i = 0 n i ⌊ a i + b c ⌋ = ∑ i = 0 n i ∑ j = 1 m [ j ≤ ⌊ a i + b c ⌋ ] = ∑ i = 0 n i ∑ j = 0 m − 1 [ c j + c − 1 < a i + b ] = ∑ j = 0 m − 1 ∑ i = 0 n i [ c j + c − 1 < a i + b ] = ∑ j = 0 m − 1 ( n ( n + 1 ) 2 − 1 2 ⌊ c j + c − b − 1 a ⌋ ( ⌊ c j + c − b − 1 a ⌋ + 1 ) ) = 1 2 ( m n ( n + 1 ) − g ( c , c − b − 1 , a , m − 1 ) − f ( c , c − b − 1 , a , m − 1 ) ) h(a,b,c,n)=\sum_{i=0}^ni\left\lfloor\frac{ai+b}{c}\right\rfloor\\ =\sum_{i=0}^ni\sum_{j=1}^m\left[j\leq \left\lfloor\frac{ai+b}{c}\right\rfloor\right]\\ =\sum_{i=0}^ni\sum_{j=0}^{m-1}\left[cj+c-1<ai+b\right]\\ =\sum_{j=0}^{m-1}\sum_{i=0}^n i\left[cj+c-1<ai+b\right]\\ =\sum_{j=0}^{m-1}\left(\frac{n(n+1)}2-\frac 12\left\lfloor\frac{cj+c-b-1}{a}\right\rfloor\left(\left\lfloor\frac{cj+c-b-1}{a}\right\rfloor+1\right)\right)\\ =\frac 12\left(mn(n+1)-g(c,c-b-1,a,m-1)-f(c,c-b-1,a,m-1)\right) h(a,b,c,n)=i=0∑ni⌊cai+b⌋=i=0∑nij=1∑m[j≤⌊cai+b⌋]=i=0∑nij=0∑m−1[cj+c−1<ai+b]=j=0∑m−1i=0∑ni[cj+c−1<ai+b]=j=0∑m−1(2n(n+1)−21⌊acj+c−b−1⌋(⌊acj+c−b−1⌋+1))=21(mn(n+1)−g(c,c−b−1,a,m−1)−f(c,c−b−1,a,m−1))
递归算即可。 a , c a,c a,c 两维每 O ( 1 ) \Omicron(1) O(1) 次至少减半,所以复杂度是 O ( log n ) \Omicron(\log n) O(logn) 级别的。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cctype>
#define MAXN 10000005
using namespace std;
inline int read()
{
int ans=0;
char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans;
}
const int MOD=998244353,INV2=(MOD+1)/2,INV6=(MOD+1)/6;
typedef long long ll;
struct node{int f,g,h;inline node(const int& f=0,const int& g=0,const int& h=0):f(f),g(g),h(h){}};
node query(int n,int a,int b,int c)
{
if (!a) return node((n+1ll)*(b/c)%MOD,(n+1ll)*(b/c)%MOD*(b/c)%MOD,n*(n+1ll)/2%MOD*(b/c)%MOD);
if (a>=c||b>=c)
{
node t=query(n,a%c,b%c,c);
return node(
(n*(n+1ll)/2%MOD*(a/c)%MOD+(n+1ll)*(b/c)%MOD+t.f)%MOD,
(n*(n+1ll)%MOD*(2ll*n+1)%MOD*INV6%MOD*(a/c)%MOD*(a/c)%MOD+(n+1ll)*(b/c)%MOD*(b/c)%MOD+t.g+n*(n+1ll)%MOD*(a/c)%MOD*(b/c)%MOD+2ll*(a/c)%MOD*t.h%MOD+2ll*(b/c)%MOD*t.f%MOD)%MOD,
(n*(n+1ll)%MOD*(2ll*n+1)%MOD*INV6%MOD*(a/c)%MOD+n*(n+1ll)/2%MOD*(b/c)%MOD+t.h)%MOD
);
}
int m=((ll)a*n+b)/c;
node t=query(m-1,c,c-b-1,a),ans;
ans.f=((ll)n*m%MOD+MOD-t.f)%MOD;
ans.g=(m*(m+1ll)%MOD*n%MOD+MOD-(2ll*t.h%MOD+2ll*t.f%MOD+ans.f)%MOD)%MOD;
ans.h=(n*(n+1ll)%MOD*m%MOD+MOD-(t.f+t.g)%MOD)*INV2%MOD;
return ans;
}
int main()
{
for (int T=read();T;T--)
{
int n,a,b,c;
n=read(),a=read(),b=read(),c=read();
node ans=query(n,a,b,c);
printf("%d %d %d\n",ans.f,ans.g,ans.h);
}
return 0;
}