P5591 小猪佩奇学数学
第一道单位根反演。还挺牛的。只是为什么但凡推导中换一步都推不出来啊 /wq,等到推式子功力足够深厚才能做到这种题吧 /yun。
单位根反演的式子形如:
\[[x|n]=\frac{1}{x}\sum_{i=0}^{x-1}\omega_{x}^{ni}
\]
- \(x|n\)
显然,原式 \(=\frac{1}{x}\sum_{i=0}^{x-1}1=1\)
- \(x\nmid n\)
原式:
\[\frac{1}{x}\sum_{i=0}^{x-1}\omega_{x}^{ni}\\ =\frac{1}{x}\cdot\frac{(\omega_{x}^n)^x-\omega_{x}^0}{\omega_{x}^n-1}\\ =\frac{1}{x}\cdot\frac{1-1}{\omega_{x}^n-1}\\ =0 \]
看回这题,发现这个式子很二项式定理,考虑把 \(\lfloor\frac{i}{k}\rfloor\) 处理后用二项式定理。
\[\sum_{i=0}^n{n\choose i}p^i\lfloor\frac{i}{k}\rfloor
\]
\(\lfloor \frac{i}{k}\rfloor\) 可以表示为 \(\sum_{j=1}^i[k|j]\)。写成单位根反演的形式即为 \(\sum_{j=1}^i\frac{1}{k}\sum_{l=0}^{k-1}\omega_{k}^{lj}\)。
\[\sum_{i=0}^n{n\choose i}p^i\sum_{j=1}^i\frac{1}{k}\sum_{l=0}^{k-1}\omega_{k}^{lj}\\
=\frac{1}{k}\sum_{i=0}^n\sum_{l=0}^{k-1}{n\choose i}p^i\sum_{j=1}^{i}\omega_{k}^{jl}\\
=\frac{1}{k}\sum_{i=0}^n\sum_{l=0}^{k-1}{n\choose i}p^i\frac{\omega_{k}^{(i+1)l}-\omega_{k}^{l}}{\omega_{k}^l-1}\\
=\frac{1}{k}\sum_{i=0}^n\sum_{l=0}^{k-1}\omega_{k}^l{n\choose i}\frac{p^i\omega_{k}^{il}-p^i}{\omega_{k}^l-1}\\
\]
\(n\) 的范围很大,最后必定要将 \(\sum_{i=0}^n\) 化到式子中。
\[=\frac{1}{k}\sum_{l=0}^{k-1}\omega_{k}^l\cdot \frac{(p\omega_{j}^l+1)^n-(p+1)^n}{\omega_{k}^l-1}\\
\]
到这里可以 \(O(k)\) 计算。但是 \(l=0\) 时,分母 \(\omega_{k}^l-1=0\),需要特殊计算:
\[\frac{1}{k}\sum_{i=0}^n{n\choose i}p^i\sum_{j=1}^i 1
\\=\frac{1}{k}\sum_{i=0}^n{n\choose i}p^ii
\\=\frac{1}{k}\sum_{i=1}^n\frac{n!}{i!(n-i)!}p^ii
\\=\frac{1}{k}\cdot np\sum_{i=1}^n\frac{(n-1)!}{(i-1)!(n-i)!}p^{i-1}
\\=\frac{1}{k}\cdot np(p+1)^{n-1}
\]
而单位根反演中只用到了单位根的周期性,也就是可以用满足 \(v^{k}=1\) 的 \(v\) 当作 \(k\) 次单位根进行运算。\(998244353\) 的原根为 \(3\)(\(3^{998244352}\equiv 1\pmod {998244353}\)),如果 \(k|(mod-1)\),就能用 \(3^{(mod-1)/k}\) 代替单位根运算,而数据范围 \(mod=998244353=2^{23}\times 119\),而 \(k\in\{w|0\le w\le 20\}\),实际上就是保证了 \(k|(mod-1)\)。
UesugiErii
// Problem: P5591 小猪佩奇学数学
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P5591
// Memory Limit: 500 MB
// Time Limit: 3000 ms
//
// Powered by CP Editor (https://cpeditor.org)
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pii pair<int,int>
#define mp make_pair
#define cfast ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);
#define intz(x,a) memset(x,a,sizeof(x))
inline ll lowbit(ll x){return x&-x;}
#define fi first
#define se second
inline void cmx(auto &x,ll y){if(y>x)x=y;}
inline void cmn(auto &x,ll y){if(y<x)x=y;}
const int N=(1<<20)+5,mod=998244353;
#define int ll
int pw[N];
int qp(int x,int y){int res=1;for(x%=mod;y;y>>=1,x=x*x%mod)if(y&1)res=res*x%mod;return res;}
void UesugiErii(){
int n,p,k,ik;ll ans=0,v=0;
cin>>n>>p>>k,ik=qp(k,mod-2),v=qp(p+1,n);
pw[1]=qp(3,(mod-1)/k);
for(int i=(pw[0]=1)+1;i<=k;i++)pw[i]=pw[i-1]*pw[1]%mod;
for(int l=1;l<k;l++)
(ans+=ik*(pw[l]*qp(p*pw[l]+1,n)%mod+mod-pw[l]*v%mod)%mod*qp(pw[l]-1,mod-2)%mod)%=mod;
(ans+=ik*(n*p%mod*qp(p+1,n-1)%mod)%mod)%=mod;
cout<<ans;
}
signed main(){
//cfast;
int _=1;//cin>>_;
for(;_;_--)UesugiErii();
return 0;
}

浙公网安备 33010602011771号