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; 
}

  

posted @ 2020-07-21 08:36  EM-LGH  阅读(153)  评论(0编辑  收藏  举报