码迷,mamicode.com
首页 > 其他好文 > 详细

LG P5395 第二类斯特林数·行

时间:2021-01-05 10:49:38      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:rgb   getch   hide   opened   输出   space   需要   mes   ios   

Description

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

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

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

Solution

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

二项式反演得

\begin{align}
\begin{Bmatrix}n \\m\end{Bmatrix}m! & = \sum_{i = 0}^m\binom mi (-1)^{m-i} i^n\\
\begin{Bmatrix}n \\m\end{Bmatrix} & =\frac{\sum_{i = 0}^m\binom mi (-1)^{m-i} i^n}{m!} \\
\begin{Bmatrix}n \\m\end{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;
}
第二类斯特林数·行

 

LG P5395 第二类斯特林数&#183;行

标签:rgb   getch   hide   opened   输出   space   需要   mes   ios   

原文地址:https://www.cnblogs.com/JDFZ-ZZ/p/14199831.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!