P5591 小猪佩奇学数学 题解
题目链接
\[\sum_{i=0}^n \binom n i \times p^{i} \times \left\lfloor \frac{i}{k} \right\rfloor \bmod 998244353
\]
\[1 \leq n,p <998244353,k \in \{2^{w}|0 \leq w \leq 20\}
\]
考虑单位根反演:
\[\left [ k \mid n \right ] = \frac{1}{k} \sum_{t=0}^{k-1} \omega_{k}^{tn}
\]
将下取整根据意义换成
\[ \left\lfloor \frac{i}{k} \right\rfloor = \left ( \frac{1}{k} \sum_{j=0}^{i}
\sum_{t=0}^{k-1} \omega_{k}^{tj} \right ) -1
\]
即 \(\left [0,n \right ]\) 中 \(k\) 的倍数。
其中从 \(0\) 开始是为了使用二项式定理凑出 \(0\) 项。
带入原式
\[\sum_{i=0}^{n} \binom{n}{i} p^i \left ( \frac{1}{k} \sum_{j=0}^{i}
\sum_{t=0}^{k-1} \left ( \omega_{k}^{t} \right ) ^ j -1
\right )
\]
提出 \(-1\),整理式子得到
\[\frac{1}{k} \sum_{i=0}^{n} \binom{n}{i} p^i \left ( \sum_{j=0}^{i}
\sum_{t=0}^{k-1} \left ( \omega_{k}^{t} \right ) ^ j
\right ) - \sum_{i=0}^{n} \binom{n}{i} p^i
\]
二项式定理得到
\[\frac{1}{k} \sum_{i=0}^{n} \binom{n}{i} p^i \left ( \sum_{j=0}^{i}
\sum_{t=0}^{k-1} \left ( \omega_{k}^{t} \right ) ^ j
\right ) - \left ( p+1 \right ) ^n
\]
注意到括号内的东西
\[ \sum_{j=0}^{i}
\sum_{t=0}^{k-1} \left ( \omega_{k}^{t} \right ) ^ j
\]
\[= \sum_{t=0}^{k-1} \sum_{j=0}^{i}
\left ( \omega_{k}^{t} \right ) ^ j
\]
特别注意:使用等比公式求和,注意到特殊的 \(\omega_{k}^{0} = 1\) ,特殊计算 \(t=0\)。
\[= \sum_{t=1}^{k-1} \frac{\omega_{k}^{t(i+1)}-1}{\omega_{k}^{t}-1}
+ (i+1)
\]
带回原式
\[\frac{1}{k} \sum_{i=0}^{n} \binom{n}{i} p^i \left (\sum_{t=1}^{k-1} \frac{\omega_{k}^{t(i+1)}-1}{\omega_{k}^{t}-1}
+ (i+1) \right ) - \left ( p+1 \right ) ^n
\]
将两部分拆开分别计算
\[\sum_{i=0}^{n} \binom{n}{i} p^i (i+1)
\]
\[= \sum_{i=0}^{n} \binom{n}{i} \times p^i \times i + (p+1)^n
\]
\[= n \sum_{i=0}^{n} \binom{n-1}{i-1} \times p^i \times i + (p+1)^n
\]
\[= np \sum_{i=0}^{n-1} \binom{n}{i} \times p^i \times i + (p+1)^n
\]
\[= np(p+1)^{n-1} + (p+1)^n
\]
对于另一部分
\[\sum_{i=0}^{n} \binom{n}{i} p^i \sum_{t=1}^{k-1} \frac{\omega_{k}^{t(i+1)}-1}{\omega_{k}^{t}-1}
\]
\[=
\sum_{t=1}^{k-1} \frac{ \sum_{i=0}^{n} \binom{n}{i} p^i \left(
\left( \omega_{k}^{t} \right) ^ {i+1} -1
\right ) }
{\omega_{k}^{t}-1}
\]
\[=
\sum_{t=1}^{k-1} \frac{ \sum_{i=0}^{n} \binom{n}{i} p^i \left(
\omega_{k}^{t} \right) ^ {i+1} - (p+1)^n
}
{\omega_{k}^{t}-1}
\]
\[=
\sum_{t=1}^{k-1} \frac{ \omega_{k}^{t} \sum_{i=0}^{n} \binom{n}{i} p^i \left(
\omega_{k}^{t} \right) ^ i - (p+1)^n
}
{\omega_{k}^{t}-1}
\]
\[=
\sum_{t=1}^{k-1} \frac{ \omega_{k}^{t} \left( p \omega_{k}^{t} +1 \right) ^ n - (p+1)^n
}
{\omega_{k}^{t}-1}
\]
则此时可以得到答案式子
\[\frac{1}{k} \left(
\sum_{t=1}^{k-1} \frac{ \omega_{k}^{t} \left( p \omega_{k}^{t} +1 \right) ^ n - (p+1)^n
}
{\omega_{k}^{t}-1} +
np(p+1)^{n-1} + (p+1)^n
\right) - (p+1)^n
\]
计算复杂度 \(O\left(k\log n\right)\)
\(\text{Code}\)
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
typedef long long ll;
const int mod=998244353;
const int G=3;
int n,p,k,ans;
inline void read(int &x)
{
int f=1;char c;
for(x=0,c=getchar();c<'0'||c>'9';c=getchar()) if(c=='-') f=-1;
for(;c>='0'&&c<='9';c=getchar()) x=(x<<1)+(x<<3)+(c^48); x*=f;
}
inline int mn(int _x,int _y){return _x<_y?_x:_y;}
inline int mx(int _x,int _y){return _x>_y?_x:_y;}
inline int ab(int _x){return _x<0?-_x:_x;}
inline int qpow(int base,int cnt){
int rest=1;base%=mod;
while(cnt){
if(cnt&1) rest=1ll*rest*base%mod;
base=1ll*base*base%mod;
cnt>>=1;
}
return rest;
}
inline int S1(){
int rest=0,tmp;
for(int t=1;t<k;t++){
int w=qpow(qpow(G,(mod-1)/k),t);
tmp=(1ll*w*qpow((1ll*p*w%mod+1)%mod,n)%mod-qpow(p+1,n)+mod)%mod;
tmp=1ll*tmp*qpow((w-1+mod)%mod,mod-2)%mod;
rest=(rest+tmp)%mod;
}
return rest;
}
inline int S2(){
return (1ll*n*p%mod*qpow(p+1,n-1)%mod+qpow(p+1,n))%mod;
}
int main()
{
read(n);read(p);read(k);
ans=(1ll*(S1()+S2())%mod*qpow(k,mod-2)%mod-qpow(p+1,n)+mod)%mod;
printf("%d\n",ans);
return 0;
}
总结:
本题运用了单位根反演来避免下取整运算,同时 \(k\) 为 \(2\) 的若干次方也为求模意义下的单位根提供便利。
在使用等比公式求和时,也应该注意公比为\(1\)的特殊情况、

浙公网安备 33010602011771号