LOJ#6247. 九个太阳 单位根反演
复习一下单位根反演:
$[k|n]=\frac{1}{k} \sum_{i=0}^{k-1} w_{k}^{ni}$,即 $[n \% k=0]$
最前面那个 $\frac{1}{k}$ 不要忘记,也不要写错!!!
当 $n$ 很大,$k$ 不大的时候可以预处理出来 $w_{k}^{i}$ 然后后面可能会加上二项式定理.
这道题求的是 $\sum_{i=0}^{n} \binom{n}{i} [i \% k =0]$,直接套上单位根反演+二项式定理即可.
最后答案为 $\frac{1}{k} \sum_{i=0}^{k-1} (w_{k}^{i}+1)^n$
code:
#include <cstdio> #include <cstring> #include <algorithm> #define N 1000005 #define ll long long #define mod 998244353 #define setIO(s) freopen(s".in","r",stdin) using namespace std; int qpow(int x,ll y) { int tmp=1; for(;y;y>>=1,x=(ll)x*x%mod) if(y&1) tmp=(ll)tmp*x%mod; return tmp; } int w[N]; int main() { // setIO("input"); ll n; int k,p,inv=1; scanf("%lld%d",&n,&k); inv=qpow(k,mod-2); w[0]=1,p=qpow(3,(mod-1)/k); for(int i=1;i<k;++i) { w[i]=(ll)w[i-1]*p%mod; } int ans=0; for(int i=0;i<=k-1;++i) { (ans+=qpow(w[i]+1,n))%=mod; } printf("%d\n",(ll)inv*ans%mod); return 0; }