• 斯特林数相关


      更基础的斯特林数:戳这里

      做了一个斯特林数的题,发现需要快速求第一类斯特林数,感觉是时候学一下了。按照从简单到难的顺序来写吧。

    第二类斯特林数·行

      给出n,求$egin{Bmatrix} n\0 end{Bmatrix}~,~egin{Bmatrix} n\1 end{Bmatrix}dotsegin{Bmatrix} n\n end{Bmatrix}$;$nleq 2 imes 10^5$

      $egin{Bmatrix} n\m end{Bmatrix}=frac{1}{m!}sumlimits_{i=0}^m(-1)^iinom{m}{i}(m-i)^n$

      $=frac{1}{m!}sumlimits_{i=0}^m(-1)^ifrac{m!}{i!(m-i)!}(m-i)^n$

      $=sumlimits_{i=0}^mfrac{(-1)^i(m-i)^n}{i!(m-i)!}$

      $=sumlimits_{i=0}^mfrac{(-1)^i}{i!} imes frac{(m-i)^n}{(m-i)!}$

      可以看得出,由于 (m-i)+i=m ,这就是一个卷积的形式了。我们把:$f(x)=sum frac{(-1)^i}{i!}x^i$ 和 $g(x)=sum frac{i^n}{i!}x^i$ 卷起来,得到的多项式的各项系数就是答案啦。

      
     1 # include <cstdio>
     2 # include <iostream>
     3 # define R register int
     4 
     5 using namespace std;
     6 
     7 const int N=600005;
     8 const int mod=167772161;
     9 const int inv_g=(mod+1)/3;
    10 int n,f[N],g[N],len,rev[N];
    11 int inv[N],fac[N];
    12 
    13 int add (int a,int b)
    14 {
    15     a+=b;
    16     if(a>=mod) return a-mod;
    17     return a;
    18 }
    19 
    20 int dec (int a,int b)
    21 {
    22     a-=b;
    23     if(a<0) return a+mod;
    24     return a;
    25 }
    26 
    27 int qui (int a,int b)
    28 {
    29     int s=1;
    30     while(b)
    31     {
    32         if(b&1) s=1LL*s*a%mod;
    33         a=1LL*a*a%mod;
    34         b>>=1;
    35     }
    36     return s;
    37 }
    38 
    39 void NTT (int *f,int v)
    40 {
    41     for (R i=1;i<=len;++i)
    42         if(i<rev[i]) swap(f[i],f[ rev[i] ]);
    43     for (R i=2;i<=len;i<<=1)
    44     {
    45         int ln=i/2,og1=qui((v==1)?3:inv_g,(mod-1)/i);
    46         for (R b=0;b<len;b+=i)
    47         {
    48             int og=1;
    49             for (R x=b;x<b+ln;++x)
    50             {
    51                 int t=1LL*og*f[x+ln]%mod;
    52                 f[x+ln]=dec(f[x],t);
    53                 f[x]=add(f[x],t);
    54                 og=1LL*og*og1%mod;
    55             }
    56         }
    57     }
    58     if(v==1) return ;
    59     int inv=qui(len,mod-2);
    60     for (R i=0;i<=len;++i) f[i]=1LL*f[i]*inv%mod;
    61 }
    62 
    63 int main()
    64 {
    65     scanf("%d",&n);
    66     fac[0]=1; for (R i=1;i<=n;++i) fac[i]=1LL*i*fac[i-1]%mod;
    67     inv[n]=qui(fac[n],mod-2);
    68     for (R i=n;i>=1;--i) inv[i-1]=1LL*inv[i]*i%mod;
    69     len=1; while(len<=2*(n+1)) len<<=1;
    70     for (R i=0;i<=n;++i)
    71     {
    72         if(i&1) f[i]=mod-inv[i]; else f[i]=inv[i];
    73         g[i]=1LL*qui(i,n)*inv[i]%mod;
    74     }
    75     for (R i=1;i<=len;++i) rev[i]=(rev[i>>1]>>1)|((i&1)?(len>>1):0);
    76     NTT(f,1); NTT(g,1);
    77     for (R i=0;i<=len;++i) f[i]=1LL*f[i]*g[i]%mod;
    78     NTT(f,-1);
    79     for (R i=0;i<=n;++i) printf("%d ",f[i]);
    80     return 0;
    81 }
    第二类斯特林数·行

    第一类斯特林数·行

      给出n,求$egin{bmatrix} n\0 end{bmatrix}~,~egin{bmatrix} n\1 end{bmatrix}dotsegin{bmatrix} n\n end{bmatrix}$;$nleq 2 imes 10^5$

      因为我们有一个快乐公式:

      $x^{overline{n}}=sumlimits_{i=0}^n x^iegin{bmatrix}n\iend{bmatrix}$

      所以其实这就是一个求上升幂的板子2333

      如果一个东西看上去非常难求,不如试试倍增吧:$x^{overline{2n}}=x^{overline{n}}(x+n)^{overline{n}}$

      假设我们已经求出了 $x^{overline{n}}$ ,怎么求 $(x+c)^{overline{n}}$ 呢?

      设 $f(x)=x^{overline{n}}=sum_{i=0}^n f_i x^i$ , 则 $(x+c)^{overline{n}}=f(x+c)=sum_{i=0}^nf_i(x+c)^i$

      $f(x+c)=sum_{i=0}^n f_isum_{j=0}^i inom{i}{j}x^jc^{i-j}$

      $=sum_{j=0}^n x^jsum_{i=0}^n f_i inom{i}{j}c^{i-j}$

      $=sum_{j=0}^n x^jsum_{i=0}^n f_i frac{i!}{j!(i-j)!}c^{i-j}$

      $=sum_{j=0}^n x^jfrac{1}{j!}sum_{i=0}^n (f_i imes i!) frac{c^{i-j}}{(i-j)!}$

       后面看上去不大能卷,考虑把f翻转一下,可以发现 $n-i+i-j=n-j$ ,这样就可以快乐卷卷了。

      复杂度依旧是 $nlog n$ ,可能这就是多项式的神奇吧。

      注意这里不能像多项式求逆那样把项数补到2的幂,否则n就变了。所以递归时要这样:如果n是奇数,那么先求出n-1的答案,然后暴力乘上 $x-n+1$;如果是偶数再折半;

      
      1 # include <cstdio>
      2 # include <iostream>
      3 # define R register int
      4 
      5 using namespace std;
      6 
      7 const int N=600005;
      8 const int mod=167772161;
      9 const int inv_g=(mod+1)/3;
     10 int n,len,f[N],g[N];
     11 int w[2][100],rev[N];
     12 int fac[N],inv[N],x[N],y[N];
     13 
     14 int add (int a,int b)
     15 {
     16     a+=b;
     17     if(a>=mod) return a-mod;
     18     return a;
     19 }
     20 
     21 int dec (int a,int b)
     22 {
     23     a-=b;
     24     if(a<0) return a+mod;
     25     return a;
     26 }
     27 
     28 int qui (int a,int b)
     29 {
     30     int s=1;
     31     while(b)
     32     {
     33         if(b&1) s=1LL*s*a%mod;
     34         a=1LL*a*a%mod;
     35         b>>=1;
     36     }
     37     return s;
     38 }
     39 
     40 void init (int n)
     41 {
     42     int i=2,t=0;
     43     while(i<=n)
     44     {
     45         w[0][t]=qui(3,(mod-1)/i);
     46         w[1][t]=qui(inv_g,(mod-1)/i);
     47         i<<=1;
     48         t++;
     49     }
     50 }
     51 
     52 void NTT (int *f,int len,int v)
     53 {
     54     for (R i=1;i<len;++i)
     55         if(i<rev[i]) swap(f[i],f[ rev[i] ]);
     56     int t=0;
     57     for (R i=2;i<=len;i<<=1)
     58     {
     59         int ln=i>>1,og1=w[(v==1)?0:1][t]; t++;
     60         for (R b=0;b<len;b+=i)
     61         {
     62             int og=1;
     63             for (R x=b;x<b+ln;++x)
     64             {
     65                 int t=1LL*og*f[x+ln]%mod;
     66                 f[x+ln]=dec(f[x],t);
     67                 f[x]=add(f[x],t);
     68                 og=1LL*og*og1%mod;
     69             }
     70         }
     71     }
     72     if(v==1) return;
     73     int inv=qui(len,mod-2);
     74     for (R i=0;i<=len;++i) f[i]=1LL*f[i]*inv%mod;
     75 }
     76 
     77 void cal (int *g,int *f,int c,int n)
     78 {
     79     int len=1; while(len<2*n) len<<=1;
     80     for (R i=1;i<len;++i) rev[i]=(rev[i>>1]>>1)|((i&1)?(len>>1):0);
     81     int sc=1;
     82     for (R i=0;i<n;++i) x[n-i-1]=1LL*f[i]*fac[i]%mod;
     83     for (R i=0;i<n;++i) y[i]=1LL*sc*inv[i]%mod,sc=1LL*sc*c%mod;
     84     for (R i=n;i<len;++i) x[i]=0,y[i]=0;
     85     NTT(x,len,1); NTT(y,len,1);
     86     for (R i=0;i<len;++i) x[i]=1LL*x[i]*y[i]%mod;
     87     NTT(x,len,-1);
     88     for (R i=0;i<n;++i)
     89         g[i]=1LL*inv[i]*x[n-i-1]%mod;
     90     for (R i=n;i<len;++i)
     91         g[i]=0;
     92 }
     93 
     94 void solve (int *f,int n)
     95 {
     96     if(n==0)
     97     {
     98         f[0]=1;
     99         return;
    100     }
    101     if(n&1)
    102     {
    103         solve(f,n-1);
    104         f[n]=f[n-1];
    105         for (R i=n-1;i;--i) f[i]=(f[i-1]+1LL*(n-1)*f[i])%mod;
    106         f[0]=1LL*f[0]*(n-1)%mod;
    107     }
    108     else
    109     {
    110         solve(f,n/2);
    111         cal(g,f,n/2,n/2+1);
    112         int len=1; while(len<=n+1) len<<=1;
    113         for (R i=1;i<len;++i) rev[i]=(rev[i>>1]>>1)|((i&1)?(len>>1):0);
    114         for (R i=len/2;i<=len;++i) f[i]=0,g[i]=0;
    115         NTT(f,len,1); NTT(g,len,1);
    116         for (R i=0;i<len;++i) f[i]=1LL*f[i]*g[i]%mod;
    117         NTT(f,len,-1);
    118         for (R i=n+1;i<len;++i) f[i]=0;
    119     }
    120 }
    121 
    122 int main()
    123 {
    124     scanf("%d",&n);
    125     len=1; while(len<(n+1)) len<<=1;
    126     init(len*2);
    127     fac[0]=1; for (R i=1;i<=n;++i) fac[i]=1LL*i*fac[i-1]%mod;
    128     inv[n]=qui(fac[n],mod-2);
    129     for (R i=n;i>=1;--i) inv[i-1]=1LL*inv[i]*i%mod;
    130     solve(f,n);
    131     for (R i=0;i<=n;++i)
    132         printf("%d ",f[i]);
    133     return 0;
    134 }
    第一类斯特林数·行

    第二类斯特林数·列

      给出n,k,求$egin{Bmatrix} 0\k end{Bmatrix}~,~egin{Bmatrix} 1\k end{Bmatrix}dotsegin{Bmatrix} n\k end{Bmatrix}$ $n,kleq 2 imes 10^5$

      不知道该怎么做的时候,可以考虑用生成函数表示原式。

      $H_k=sumlimits_{i=0}^negin{Bmatrix} i\k end{Bmatrix}x^i$

      $~~~~~=sumlimits_{i=0}^n left( egin{Bmatrix} i-1\k-1 end{Bmatrix}+k imes egin{Bmatrix} i-1\k end{Bmatrix} ight)x^i$

      $~~~~~=sumlimits_{i=0}^n egin{Bmatrix} i-1\k-1 end{Bmatrix}x^i+sumlimits_{i=0}^n k imes egin{Bmatrix} i-1\k end{Bmatrix}x^i$

      $~~~~~=xH_{k-1}+kxH_k$

      $ herefore H_k(1-kx)=xH_{k-1} $

      $ herefore H_k=frac{x}{1-kx}H_{k-1}$

      $ herefore H_k=H_0prodlimits_{i=1}^k(frac{x}{1-ix})$

      $H_0=1$ , $prodlimits_{i=1}^k(frac{x}{1-ix})=x^kprodlimits_{i=1}^k(frac{1}{1-ix})=x^kleft(prodlimits_{i=1}^k({1-ix}) ight)^{-1}$

      $prodlimits_{i=1}^k({1-ix})=x^kprodlimits_{i=1}^k({frac{1}{x}-i})$

      很妙妙的是,$x^kprodlimits_{i=1}^k({frac{1}{x}-i})$ 恰好就等于 $prod_{i=1}^k(x-i)$ 的翻转(系数数组翻转)。

      $prod_{i=1}^k(x-i)$就比较好求了,因为 $prod_{i=1}^k(x-i)=frac{x^{underline{k+1}}}{x}$。

      下降幂怎么求呢?其实和上升幂也差不多。

      $f(x) ightarrow f(x-c)$ 看上去和上升幂那里差不多,我们对它进行一波改造:

      $f(x) ightarrow f(x+(mod-c))$

      于是套用上升幂那里的做法就可以啦~

      
      1 # include <cstdio>
      2 # include <iostream>
      3 # include <cstring>
      4 # define R register int
      5 # define ll long long
      6 
      7 using namespace std;
      8 
      9 const int mod=167772161;
     10 const int inv_g=(mod+1)/3;
     11 const int N=300005;
     12 int n,k,f[N],g[N];
     13 int w[2][100],rev[N];
     14 int fac[N],inv[N],x[N],y[N];
     15 
     16 int add (int a,int b)
     17 {
     18     a+=b;
     19     if(a>=mod) return a-mod;
     20     return a;
     21 }
     22 
     23 int dec (int a,int b)
     24 {
     25     a-=b;
     26     if(a<0) return a+mod;
     27     return a;
     28 }
     29 
     30 int qui (int a,int b)
     31 {
     32     int s=1;
     33     while(b)
     34     {
     35         if(b&1) s=1LL*s*a%mod;
     36         a=1LL*a*a%mod;
     37         b>>=1;
     38     }
     39     return s;
     40 }
     41 
     42 void NTT (int *f,int len,int v)
     43 {
     44     for (R i=1;i<len;++i) 
     45         if(i<rev[i]) swap(f[i],f[ rev[i] ]);
     46     int t=0;
     47     for (R i=2;i<=len;i<<=1)
     48     {
     49         int ln=i/2,og1=w[ (v==1)?0:1 ][t]; t++;
     50         for (R b=0;b<len;b+=i)
     51         {
     52             ll og=1;
     53             for (R x=b;x<b+ln;++x)
     54             {
     55                 ll t=f[x+ln]*og%mod;
     56                 f[x+ln]=dec(f[x],t);
     57                 f[x]=add(f[x],t);
     58                 og=og*og1%mod;
     59             }
     60         }
     61     }
     62     if(v==1) return;
     63     int inv=qui(len,mod-2);
     64     for (R i=0;i<len;++i) f[i]=1LL*f[i]*inv%mod;
     65 }
     66 
     67 void Inv (int *f,int *g,int len)
     68 {
     69     if(len==1)
     70     {
     71         g[0]=qui(f[0],mod-2);
     72         return ;
     73     }
     74     Inv(f,g,len>>1);
     75     for (R i=0;i<len;++i) x[i]=f[i],y[i]=g[i];
     76     for (R i=0;i<len*2;++i) rev[i]=(rev[i>>1]>>1)|((i&1)?len:0);
     77     NTT(x,len*2,1); NTT(y,len*2,1);
     78     for (R i=0;i<len*2;++i) x[i]=1LL*x[i]*y[i]%mod*y[i]%mod;
     79     NTT(x,len*2,-1);
     80     for (R i=0;i<len;++i)
     81         g[i]=dec(add(g[i],g[i]),x[i]);
     82 }
     83 
     84 void init (int n)
     85 {
     86     int i=2,t=0;
     87     while(i<=N)
     88     {
     89         w[0][t]=qui(3,(mod-1)/i);
     90         w[1][t]=qui(inv_g,(mod-1)/i);
     91         i<<=1; t++;
     92     }
     93     fac[0]=1; for (R i=1;i<=n;++i) fac[i]=1LL*fac[i-1]*i%mod;
     94     inv[n]=qui(fac[n],mod-2);
     95     for (R i=n;i>=1;--i) inv[i-1]=1LL*i*inv[i]%mod;
     96 }
     97 
     98 void cal (int *f,int *g,int n,int c)
     99 {
    100     int len=1; while(len<2*n) len<<=1;
    101     for (R i=1;i<len;++i) rev[i]=(rev[i>>1]>>1)|((i&1)?(len>>1):0);
    102     ll sc=1;
    103     for (R i=0;i<n;++i) x[n-i-1]=1LL*f[i]*fac[i]%mod;
    104     for (R i=0;i<n;++i) y[i]=sc*inv[i]%mod,sc=sc*c%mod;
    105     for (R i=n;i<len;++i) x[i]=y[i]=0;
    106     NTT(x,len,1); NTT(y,len,1);
    107     for (R i=0;i<len;++i) x[i]=1LL*x[i]*y[i]%mod;
    108     NTT(x,len,-1);
    109     for (R i=0;i<n;++i) g[i]=1LL*x[n-i-1]*inv[i]%mod;
    110 }
    111 
    112 void solve (int *f,int n)
    113 {
    114     if(n==1) { f[1]=1; return; }
    115     if(n&1)
    116     {
    117         solve(f,n-1);
    118         f[n]=f[n-1];
    119         for (R i=n-1;i>=1;--i)
    120             f[i]=(f[i-1]+1LL*(mod-n+1)*f[i])%mod;
    121         f[0]=1LL*(mod-n+1)*f[0]%mod;
    122     }
    123     else
    124     {
    125         solve(f,n/2);
    126         cal(f,g,n/2+1,mod-n/2);
    127         int len=1; while(len<=n) len<<=1;
    128         for (R i=1;i<len;++i)
    129             rev[i]=(rev[i>>1]>>1)|((i&1)?(len>>1):0);
    130         for (R i=n/2+1;i<=len;++i) f[i]=g[i]=0;
    131         NTT(f,len,1); NTT(g,len,1);
    132         for (R i=0;i<len;++i) f[i]=1LL*f[i]*g[i]%mod;
    133         NTT(f,len,-1);
    134         for (R i=n+1;i<len;++i) f[i]=0;
    135     }
    136 }
    137 
    138 int main()
    139 {
    140     scanf("%d%d",&n,&k);
    141     if(k>n)
    142     {
    143         for (R i=0;i<=n;++i) printf("0 ");
    144         return 0;
    145     }
    146     init(k+1); 
    147     solve(f,k+1);
    148     memset(g,0,sizeof(g));
    149     memset(x,0,sizeof(x));
    150     memset(y,0,sizeof(y));
    151     for (R i=0;i<k+1;++i) f[i]=f[i+1]; f[k+1]=0;
    152     for (R i=0;i<=k/2;++i) swap(f[i],f[k-i]);
    153     for (R i=n-k+1;i<k+1;++i) f[i]=0;
    154     int len=1; while(len<(n-k+1)) len<<=1;
    155     Inv(f,g,len);
    156     for (R i=0;i<k;++i) printf("0 ");
    157     for (R i=0;i<n-k+1;++i) printf("%d ",g[i]);
    158     return 0;
    159 }
    第二类斯特林数·列

    第一类斯特林数·列

       给出n,k,求$egin{bmatrix} 0\k end{bmatrix}~,~egin{bmatrix} 1\k end{bmatrix}dotsegin{bmatrix} n\k end{bmatrix}$ $n,kleq 2 imes 10^5$

      种种方法都不太好用了,只好考虑组合意义:第一类斯特林数就是把n个数分成k个圆排列的方案数;

      这种组合类的题目,可以试着用EGF来解决。

      首先,n个数组成圆排列的方案数是 $(n-1)!$;所以EGF就是:$sum_{i=0}^kfrac{(i-1)!}{i!}x^i$

      我们对这个EGF做一个k次幂,第i项的系数再乘上 $i!$ 就是把i个数分成k个圆排列的方案数啦。

      
      1 # include <cstdio>
      2 # include <iostream>
      3 # include <cstring>
      4 # define R register int
      5 # define ll long long
      6 
      7 using namespace std;
      8 
      9 const int N=300005;
     10 const int mod=167772161;
     11 const int inv_g=(mod+1)/3;
     12 int n,k,f[N],g[N],t[N],rev[N];
     13 int fac[N],inv[N],finv[N];
     14 int w[2][100],x[N],y[N];
     15 
     16 int add (int a,int b)
     17 {
     18     a+=b;
     19     if(a>=mod) return a-mod;
     20     return a;
     21 }
     22 
     23 int dec (int a,int b)
     24 {
     25     a-=b;
     26     if(a<0) return a+mod;
     27     return a;
     28 }
     29 
     30 int qui (int a,int b)
     31 {
     32     int s=1;
     33     while(b)
     34     {
     35         if(b&1) s=1LL*s*a%mod;
     36         a=1LL*a*a%mod;
     37         b>>=1;
     38     }
     39     return s;
     40 }
     41 
     42 void NTT (int *f,int len,int v)
     43 {
     44     for (R i=0;i<len;++i)
     45         if(i<rev[i]) swap(f[i],f[ rev[i] ]);
     46     int t=0;
     47     for (R i=2;i<=len;i<<=1)
     48     {
     49         int ln=i/2;
     50         ll og,og1=w[(v==1)?0:1][t]; t++;
     51         for (R b=0;b<len;b+=i)
     52         {
     53             og=1;
     54             for (R x=b;x<b+ln;++x)
     55             {
     56                 int t=og*f[x+ln]%mod;
     57                 f[x+ln]=dec(f[x],t);
     58                 f[x]=add(f[x],t);
     59                 og=og*og1%mod;
     60             }
     61         }
     62     }
     63     if(v==1) return;
     64     int inv=qui(len,mod-2);
     65     for (R i=0;i<len;++i) f[i]=1LL*f[i]*inv%mod;
     66 }
     67 
     68 void init (int n)
     69 {
     70     n+=10;
     71     fac[0]=1; for (R i=1;i<=n;++i) fac[i]=1LL*i*fac[i-1]%mod;
     72     inv[1]=1; for (R i=2;i<=n;++i) inv[i]=mod-1LL*(mod/i)*inv[mod%i]%mod;
     73     finv[0]=1; for (R i=1;i<=n;++i) finv[i]=1LL*finv[i-1]*inv[i]%mod;
     74     int i=2,t=0;
     75     while(i<N)
     76     {
     77         w[0][t]=qui(3,(mod-1)/i);
     78         w[1][t]=qui(inv_g,(mod-1)/i);
     79         i<<=1; t++;
     80     }
     81 }
     82 
     83 void der (int *f,int *g,int len)
     84 {
     85     for (R i=1;i<len;++i)
     86         g[i-1]=1LL*i*f[i]%mod;
     87     g[len]=g[len-1]=0;
     88 }
     89 
     90 void Int (int *f,int *g,int len)
     91 {
     92     for (R i=1;i<len;++i) g[i]=1LL*f[i-1]*inv[i]%mod;
     93     g[0]=0;
     94 }
     95 
     96 void mul (int *f,int *g,int len)
     97 {
     98     for (R i=0;i<len/2;++i)
     99         x[i]=f[i],y[i]=g[i];
    100     for (R i=len/2;i<len;++i)
    101         x[i]=y[i]=0;
    102     for (R i=1;i<len;++i)
    103         rev[i]=(rev[i>>1]>>1)|((i&1)?(len>>1):0);
    104     NTT(x,len,1); NTT(y,len,1);
    105     for (R i=0;i<len;++i) x[i]=1LL*x[i]*y[i]%mod;
    106     NTT(x,len,-1);
    107     for (R i=0;i<len;++i)
    108         f[i]=x[i];
    109 }
    110 
    111 int h[N];
    112 
    113 void Inv (int *f,int *g,int len)
    114 {
    115     if(len==1)
    116     {
    117         g[0]=qui(f[0],mod-2);
    118         return;
    119     }
    120     Inv(f,g,len/2);
    121     for (R i=0;i<len;++i) x[i]=f[i],y[i]=g[i];
    122     for (R i=len;i<len*2;++i) x[i]=y[i]=0;
    123     for (R i=1;i<len*2;++i) rev[i]=(rev[i>>1]>>1)|((i&1)?len:0);
    124     NTT(x,len*2,1); NTT(y,len*2,1);
    125     for (R i=0;i<len*2;++i) x[i]=1LL*x[i]*y[i]%mod*y[i]%mod;
    126     NTT(x,len*2,-1);
    127     for (R i=0;i<len;++i) g[i]=dec(add(g[i],g[i]),x[i]);
    128 }
    129 
    130 void Ln (int *f,int *g,int n)
    131 {
    132     der(f,g,n);
    133     int len=1; while(len<n) len<<=1;
    134     Inv(f,h,len);
    135     mul(g,h,len*2);
    136     Int(g,f,n);
    137     for (R i=0;i<=len*2;++i) g[i]=h[i]=0;
    138 }
    139 
    140 int t2[N];
    141 
    142 void Exp (int *f,int *g,int len)
    143 {
    144     if(len==1)
    145     {
    146         g[0]=1;
    147         return;
    148     }
    149     Exp(f,g,len>>1);
    150     for (R i=0;i<len/2;++i) t2[i]=g[i];
    151     Ln(g,t,len);
    152     g[0]=dec(f[0]+1,g[0]);
    153     for (R i=1;i<len;++i) g[i]=dec(f[i],g[i]);
    154     mul(g,t2,len*2);
    155     for (R i=len;i<len*2;++i) g[i]=t2[i]=0;
    156 }
    157 
    158 int main()
    159 {
    160     scanf("%d%d",&n,&k);
    161     if(n<k)
    162     {
    163         for (R i=0;i<=n;++i) printf("0 ");
    164         return 0;
    165     }
    166     init(n);
    167     for (R i=0;i<=n;++i) f[i]=inv[i+1];
    168     Ln(f,t,n+1);
    169     for (R i=0;i<=n;++i) f[i]=1LL*f[i]*k%mod;
    170     int len=1; while(len<n+1) len<<=1;
    171     Exp(f,g,len);
    172     for (R i=0;i<k;++i) printf("0 ");
    173     for (R i=k;i<=n;++i)
    174         printf("%lld ",1LL*g[i-k]*finv[k]%mod*fac[i]%mod);
    175     return 0;
    176 }
    第一类斯特林数·列

      写了好几天,终于写完了!接下来写点什么呢?还没想好...

  • 相关阅读:
    Spring AOP原理
    Spring Boot引入Oracle Jar
    Cookie
    资源验证
    HTTP各种特性
    高性能网络编程之IO和NIO阻塞分析
    Http协议基础及发展历史
    Http原理与实践
    设计模式-回顾
    http://jingyan.baidu.com/article/fcb5aff78e6a48edab4a7146.html
  • 原文地址:https://www.cnblogs.com/shzr/p/13217263.html
Copyright © 2020-2023  润新知