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

      

  • 相关阅读:
    关于DotNETStruts
    SQL语句导入导出大全
    一个打印Dataset的.net的打印类
    遍历指定文件夹下所有的文件
    SQL Server SQL导入导出语句
    查看OCX的属性和方法的脚本
    关于写文本文件的问题
    新钶信息系统面试
    【POJ1208】The Blocks Problem
    【POJ1363】Rails
  • 原文地址:https://www.cnblogs.com/guangheli/p/11884768.html
Copyright © 2020-2023  润新知