洛谷P5591 小猪佩奇学数学【单位根反演】
Description
请去传送门阅读。
Solution
柿子中最辣手的无疑是\(\lfloor \dfrac ik\rfloor\)了,如果没有它原式就是一个二项式定理,但我们可以将它转化为:
\[\lfloor \frac ik \rfloor=\sum_{j=1}^{i}[k|j]
\]
然后就可以上单位根反演了,同时我们隐隐猜出了原题的解法是二项式定理,为了凑出二项式定理的柿子,我们将下标改为从\(0\)开始,
\[\lfloor \frac ik \rfloor=\sum_{j=0}^{i}[k|j]-1
\]
代入原式:
\[ans=\sum_{i=0}^{n}\binom ni p^i (\sum_{j=0}^{i}\frac 1k \sum_{d=0}^{k-1}w_k^{dj}-1)
\]
提出\(-1\)并交换和式得:
\[\begin{aligned}
&=\frac{1}{k}\sum_{d=0}^{k-1}\sum_{i=0}^{n}\binom ni p^i\sum_{j=0}^{i}w_k^{dj}- \sum_{i=0}^{n}\binom ni p^i\\
&=\frac{1}{k}\sum_{d=0}^{k-1}\sum_{i=0}^{n}\binom ni p^i\frac{w_k^{d(i+1)}-1}{w_k^d-1}- (p+1)^n\\
\end{aligned}
\]
将减号前面的柿子拆成两部分,都是二项式定理的柿子:
\[\begin{aligned}
=\frac{1}{k}\sum_{d=0}^{k-1}(\sum_{i=0}^{n}\binom ni p^i\frac{w_k^{d(i+1)}}{w_k^d-1}-\sum_{i=0}^{n}\binom ni p^i\frac 1{w_k^d-1})- (p+1)^n\\
=\frac{1}{k}\sum_{d=0}^{k-1}(w_k^d\frac{(pw_k^d+1)^n}{w_k^d-1}-\frac{(p+1)^n}{w_k^d-1})- (p+1)^n
\end{aligned}
\]
这时候就可以直接做了,注意特判\(d=0\)时分母为\(0\)的情况:
此时答案为
\[\sum_{i=0}^{n}\binom{n}{i}p^i\sum_{j=0}^{i}w_k^0\\
=\sum_{i=0}^{n}\binom{n}{i}p^i(i+1)\\
=\sum_{i=0}^{n}\binom{n}{i}p^ii+\sum_{i=0}^{n}\binom{n}{i}p^i
\]
后一部分不用说,是\((p+1)^n\),对于前一部分,注意到\(\dbinom nii=n\dbinom {n-1}{i-1}\),因此
\[=n\sum_{i=0}^{n}\binom{n-1}{i-1} p^i\\
=np\sum_{i=0}^{n-1}\binom{n}{i}p^i=np(p+1)^{n-1}
\]
于是就做完了,复杂度\(\mathcal O(klog(n))\)。
Code
比我的题解还短。
#include<bits/stdc++.h>
using namespace std;
const int mod=998244353;
inline int ksm(int x,int y){
int ret=1;
for(;y;y>>=1,x=1ll*x*x%mod) if(y&1) ret=1ll*ret*x%mod;
return ret;
}
inline int add(int x,int y){return (x+y>=mod)?x+y-mod:x+y;}
inline int dec(int x,int y){return (x-y<0)?x-y+mod:x-y;}
int n,p,k;
int main(){
scanf("%d%d%d",&n,&p,&k);
int ret=0,w=ksm(3,(mod-1)/k);
int np=add(p,1);
for(int i=0;i<k;++i){
if(!i) ret=add(ret,add(ksm(np,n),1ll*n*p%mod*ksm(np,n-1)%mod));
else{
int ww=ksm(w,i);
int ans=ksm(dec(ww,1),mod-2);
ans=1ll*ans*dec(1ll*ww*ksm(add(1ll*p*ww%mod,1),n)%mod,ksm(np,n))%mod;
ret=add(ret,ans);
}
}
printf("%d\n",dec(1ll*ret*ksm(k,mod-2)%mod,ksm(np,n)));
return 0;
}