思路:题目提示得很明显是单位根反演,我们将
⌊
i
k
⌋
\lfloor\frac{i}{k}\rfloor
⌊ki⌋ 拆成
i
−
i
%
k
k
\frac{i-i\%k}{k}
ki−i%k,前半部分用二项式定理,用单位根反演处理后半部分,即
∑
t
=
1
k
−
1
t
∑
i
=
0
n
(
n
i
)
p
i
∑
j
=
0
k
−
1
ω
k
j
(
i
−
t
)
k
=
1
k
∑
t
t
∑
j
=
0
k
−
1
ω
k
−
j
t
(
p
ω
k
j
+
1
)
n
=
1
k
∑
j
(
p
ω
k
j
+
1
)
n
∑
t
t
ω
k
−
t
j
\sum_{t=1}^{k-1}t\sum_{i=0}^{n}\binom{n}{i}p^i\frac{\sum_{j=0}^{k-1}\omega_k^{j(i-t)}}{k}\\=\frac{1}{k}\sum_{t}t\sum_{j=0}^{k-1}\omega^{-jt}_k(p\omega^j_k+1)^n\\=\frac{1}{k}\sum_j(p\omega_k^j+1)^n\sum_tt\omega_k^{-tj}
t=1∑k−1ti=0∑n(in)pik∑j=0k−1ωkj(i−t)=k1t∑tj=0∑k−1ωk−jt(pωkj+1)n=k1j∑(pωkj+1)nt∑tωk−tj 按
j
j
j 是否为 0 讨论,不为 0 可以等比数列求和,如果用
b
s
g
s
bsgs
bsgs 求幂,线性求逆元的话可以
O
(
n
)
O(n)
O(n)
#include<bits/stdc++.h>
#define cs const
using namespace std;
typedef long long ll;
cs int Mod =998244353;intadd(int a,int b){return a + b >= Mod ? a + b - Mod : a + b;}intdec(int a,int b){return a - b <0 ? a - b + Mod : a - b;}intmul(int a,int b){return1ll * a * b % Mod;}
void Add(int&a,int b){ a =add(a,b);}
void Mul(int&a,int b){ a =mul(a,b);}
void Dec(int&a,int b){ a =dec(a,b);}intksm(int a,int b){int as=1;for(;b;b>>=1,a=mul(a,a))if(b&1) as=mul(as,a);return as;}
cs int N =1<<20|5;int n, p, k;int w[N];intmain(){
#ifdef FSYolanda
freopen("1.in","r",stdin);
#endif
scanf("%d%d%d",&n,&p,&k);int ik=ksm(k,Mod-2);int A=mul(mul(n,p),ksm(p+1,n-1)), B=0;int wn=ksm(3,(Mod-1)/k); w[0]=1;for(int i=1; i<k; i++) w[i]=mul(w[i-1],wn);for(int i=0; i<k; i++){int coe=ksm(add(mul(p,w[i]),1),n);if(i==0)Add(B,mul(coe,((ll)k*(k-1)>>1)%Mod));elseAdd(B,mul(coe,mul(k,ksm(dec(w[k-i],1),Mod-2))));}Mul(B,ik); cout<<mul(ik,dec(A,B));return0;}