zoukankan      html  css  js  c++  java
  • LG P5395 第二类斯特林数·行

    Description

    第二类斯特林数$egin{Bmatrix} n \m end{Bmatrix}$表示把$n$个不同元素划分成$m$个相同的集合中(不能有空集)的方案数。

    给定$n$,对于所有的整数$iin[0,n]$,你要求出$egin{Bmatrix} n \i end{Bmatrix}$。

    由于答案会非常大,所以你的输出需要对$167772161$($2^{25} imes 5+1$,是一个质数)取模

    Solution

    egin{align}
    m^n & = sum _{i = 0}^m m^{underline{i} }\
    & =sum_{i=0}^m frac{m!}{(m-i)!}egin{Bmatrix}n \iend{Bmatrix} \
    & = sum _{i=0}^minom{m}{i} i!egin{Bmatrix}n \iend{Bmatrix}
    end{align}

    二项式反演得

    egin{align}
    egin{Bmatrix}n \mend{Bmatrix}m! & = sum_{i = 0}^minom mi (-1)^{m-i} i^n\
    egin{Bmatrix}n \mend{Bmatrix} & =frac{sum_{i = 0}^minom mi (-1)^{m-i} i^n}{m!} \
    egin{Bmatrix}n \mend{Bmatrix} & =frac{(-1)^{m-i}}{(m-i)!}frac{i^n}{i!}
    end{align}

    可以FFT求解

    #include<iostream>
    #include<cstdio>
    using namespace std;
    int n,rev[800005],s=2,tot=1;
    long long fac[200005]={1},inv[200005],F[800005],G[800005],one=1;
    const long long mod=167772161;
    inline int read()
    {
        int w=0,f=1;
        char ch=0;
        while(ch<'0'||ch>'9'){if(ch=='-') f=-1; ch=getchar();}
        while(ch>='0'&&ch<='9')w=(w<<1)+(w<<3)+ch-'0',ch=getchar();
        return w*f;
    }
    long long ksm(long long a,long long p)
    {
        long long ret=1;
        while(p)
        {
            if(p&1) (ret*=a)%=mod;
            (a*=a)%=mod,p>>=1;
        }
        return ret;
    }
    void ntt(long long *a,int n,int INV)
    {
        for(int i=0;i<n;i++) if(i<rev[i]) swap(a[i],a[rev[i]]);
        for(int i=1;i<n;i<<=1)
        {
            long long wn=ksm(3,(mod-1)/i/2);
            if(INV==-1) wn=ksm(wn,mod-2);
            for(int j=0;j<n;j+=2*i)
            {
                long long w=1;
                for(int k=j;k<j+i;k++)
                {
                    long long x=a[k],y=w*a[k+i]%mod;
                    a[k]=(x+y)%mod,a[k+i]=(x-y+mod)%mod,(w*=wn)%=mod;
                }
            }
        }
        if(INV==-1)
        {
            long long temp=ksm(n,mod-2);
            for(int i=0;i<n;i++) (a[i]*=temp)%=mod;
        }
    }
    int main()
    {
        for(int i=1;i<=200000;i++) fac[i]=fac[i-1]*i%mod;
        inv[200000]=ksm(fac[200000],mod-2);
        for(int i=199999;~i;i--) inv[i]=inv[i+1]*(i+1)%mod;
        n=read();
        for(int i=0;i<=n;i++,one=mod-one) F[i]=one*inv[i]%mod,G[i]=ksm(i,n)*inv[i]%mod;
        while(s<=2*n+2) s<<=1,++tot;
        for(int i=0;i<s;i++) rev[i]=(rev[i>>1]>>1)|((i&1)<<(tot-1));
        ntt(F,s,1),ntt(G,s,1);
        for(int i=0;i<s;i++) (F[i]*=G[i])%=mod;
        ntt(F,s,-1);
        for(int i=0;i<=n;i++) printf("%lld ",F[i]);
        return 0;
    }
    第二类斯特林数·行
  • 相关阅读:
    falsh读取网页数据
    IBATISNET中的lazyLoad
    Json.Net学习笔记(四) Json对象的读写
    Json.Net学习笔记(五) 自定义Json序列化特性
    Json.Net学习笔记(三) Json与Xml之间的转换
    将 GridView 中的内容导出到 Excel 中多个工作表(Sheet) 的方法
    jQuery–20个最新的jQuery效果.
    Json.Net学习笔记(七) 序列化集合
    Json.Net学习笔记(六) Json.Net中关于时间的序列化
    Json.Net 学习笔记(一)
  • 原文地址:https://www.cnblogs.com/JDFZ-ZZ/p/14199831.html
Copyright © 2011-2022 走看看