【luogu 5395】 【模板】第二类斯特林数·行

code: 

#include <bits/stdc++.h>  
#define ll long long 
#define setIO(s) freopen(s".in","r",stdin)  
using namespace std;          
int n;           
const ll mod=167772161,G=3,N=400006;        
ll f[N<<1],g[N<<1],fac[N],inv[N];      
ll qpow(ll x,ll y) 
{      
    ll tmp=1ll; 
    while(y) 
    {
    	if(y&1) tmp=tmp*x%mod;         
    	y>>=1,x=x*x%mod; 
    }  
    return tmp;    
}
void NTT(ll *a,int len,int flag)
{
    int i,j,k,mid;
    for(i=k=0;i<len;++i)
    {
        if(i>k) swap(a[i],a[k]);
        for(j=len>>1;(k^=j)<j;j>>=1);        
    }
    for(mid=1;mid<len;mid<<=1)          
    {
        ll wn=qpow(G,(mod-1)/(mid<<1));    
        if(flag==-1) wn=qpow(wn,mod-2);     
        for(i=0;i<len;i+=(mid<<1))         
        {  
            ll w=1ll;   
            for(j=0;j<mid;++j)
            {
                ll x=a[i+j],y=w*a[i+mid+j]%mod;        
                a[i+j]=(x+y)%mod,a[i+j+mid]=(x-y+mod)%mod;   
                w=w*wn%mod;  
            }
        }
    }
    if(flag==-1)
    {
        ll re=qpow(len,mod-2);         
        for(i=0;i<len;++i) a[i]=a[i]*re%mod;  
    }
}               
int main() 
{ 
    // setIO("input"); 
    scanf("%d",&n);                     
    fac[0]=1ll; 
    inv[0]=1ll;         
    int i,j,limit=1; 
    for(i=1;i<=n;++i)   fac[i]=fac[i-1]*1ll*i%mod,  inv[i]=qpow(fac[i],mod-2);    
    for(i=0;i<=n;++i)   
    {
        g[i]=qpow(i,n)*inv[i]%mod;                
        if(i&1)  f[i]=mod-inv[i];            
        else f[i]=inv[i];      
    }   
    for(;limit<=2*(n+1);limit<<=1);                                         
    NTT(f,limit,1),NTT(g,limit,1);                                                                                      
    for(i=0;i<limit;++i)  f[i]=f[i]*g[i]%mod;           
    NTT(f,limit,-1);                                               
    for(i=0;i<=n;++i)      printf("%lld ",f[i]);    
    return 0;   
}    

  

posted @ 2019-11-18 20:17  EM-LGH  阅读(150)  评论(0编辑  收藏  举报