zoukankan      html  css  js  c++  java
  • [Tjoi2016&Heoi2016]求和

    Description

    在2016年,佳媛姐姐刚刚学习了第二类斯特林数,非常开心。

    现在他想计算这样一个函数的值:
    S(i, j)表示第二类斯特林数,递推公式为:
    S(i, j) = j ∗ S(i − 1, j) + S(i − 1, j − 1), 1 <= j <= i − 1。
    边界条件为:S(i, i) = 1(0 <= i), S(i, 0) = 0(1 <= i)
    你能帮帮他吗?

    Input

    输入只有一个正整数

    Output

     输出f(n)。由于结果会很大,输出f(n)对998244353(7 × 17 × 223 + 1)取模的结果即可。1 ≤ n ≤ 100000

    Sample Input

    3

    Sample Output

    87
    带入斯特林数通项公式:
    $ egin{array}{l}f(n) = sumlimits_{i = 0}^n {sumlimits_{j = 0}^n {sumlimits_{k = 0}^j {{{( - 1)}^k}*frac{{{{(j - k)}^i}}}{{k!(j - k)!}}} {2^j}*j!} } \end{array} $
    再把i的sigma丢到后面去 $ f(n)=sumlimits_{j = 0}^n {sumlimits_{k = 0}^j {{{( - 1)}^k}*frac{{sumlimits_{i = 0}^{ m{n}} {{{(j - k)}^i}} }}{{k!(j - k)!}}} {2^j}*j!}$
    $f(n) = sumlimits_{j = 0}^n {{2^j}*j!sumlimits_{k = 0}^j {frac{{{{( - 1)}^k}}}{{{ m{k!}}}}*frac{{sumlimits_{i = 0}^{ m{n}} {{{(j - k)}^i}} }}{{(j - k)!}}} } $

    这就是一个卷积,直接NTT
    不过此题还可以分治NTT
     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 #include<cmath>
     6 using namespace std;
     7 const int N=100000;
     8 int G=3,Mod=998244353;
     9 int a[8*N],fac[5*N],R[8*N],ifac[5*N],inv[5*N],c[5*N],b[8*N],ans,n;
    10 int qpow(int x,int y)
    11 {
    12   int res=1;
    13   while (y)
    14     {
    15       if (y&1) res=1ll*res*x%Mod;
    16       x=1ll*x*x%Mod;
    17       y>>=1;
    18     }
    19   return res;
    20 }
    21 void NTT(int *A,int len,int o)
    22 {int wn,w,i,j,k,x,y;
    23   for (i=0;i<len;i++)
    24     if (i<R[i]) swap(A[i],A[R[i]]);
    25   for (i=1;i<len;i<<=1)
    26     {
    27       wn=qpow(G,(Mod-1)/(i<<1));
    28       if (o==-1) wn=qpow(wn,Mod-2);
    29       for (j=0;j<len;j+=(i<<1))
    30     {
    31       w=1;
    32       for (k=0;k<i;k++,w=1ll*w*wn%Mod)
    33         {
    34           x=A[j+k];y=1ll*w*A[j+k+i]%Mod;
    35           A[j+k]=x+y;
    36           if (A[j+k]>=Mod) A[j+k]-=Mod;
    37           A[j+k+i]=x-y;
    38           if (A[j+k+i]<0) A[j+k+i]+=Mod;
    39         }
    40     }
    41     }
    42   if (o==-1)
    43     {
    44       int tmp=qpow(len,Mod-2);
    45       for (i=0;i<len;i++)
    46     A[i]=1ll*A[i]*tmp%Mod;
    47     }
    48 }
    49 int main()
    50 {int i,len,lg;
    51   cin>>n;
    52   fac[0]=fac[1]=ifac[0]=ifac[1]=inv[1]=1;
    53   for (i=2;i<=n;i++)
    54     {
    55       fac[i]=1ll*fac[i-1]*i%Mod;
    56       inv[i]=1ll*(Mod-Mod/i)*inv[Mod%i]%Mod;
    57       ifac[i]=1ll*ifac[i-1]*inv[i]%Mod;   
    58     }
    59   for (i=0;i<=n;i++)
    60     if (i%2==0)
    61       a[i]=ifac[i];
    62     else a[i]=(Mod-ifac[i])%Mod;
    63   b[0]=1;b[1]=n+1;
    64   for (i=2;i<=n;i++)
    65     b[i]=1ll*(qpow(i,n+1)-1)*inv[i-1]%Mod*ifac[i]%Mod,b[i]=(b[i]+Mod)%Mod;
    66   len=1;
    67   while (len<=2*n) len*=2,lg++;
    68   for (i=0;i<len;i++)
    69     R[i]=(R[i>>1]>>1)|((i&1)<<(lg-1));
    70   NTT(a,len,1);NTT(b,len,1);
    71   for (i=0;i<len;i++)
    72     a[i]=1ll*a[i]*b[i]%Mod;
    73   NTT(a,len,-1);
    74   for (i=0;i<=n;i++)
    75     ans=1ll*(ans+1ll*qpow(2,i)*fac[i]%Mod*a[i]%Mod)%Mod;
    76   cout<<ans;
    77 }
  • 相关阅读:
    RabbitMQ学习笔记
    常用算法之排序(3)
    常用算法之排序(2)
    常用算法之排序(1)
    MySQL 是怎样运行的:从根儿上理解 MySQL:字符集和比较规则
    springboot整合websocket实现一对一消息推送和广播消息推送
    喜大普奔!GitHub中文版帮助文档上线了!
    趣图:这是拿offer极高的面试经验
    推荐十大经典排序算法,再也不用担心面试了!
    谈谈培训机构的骗局
  • 原文地址:https://www.cnblogs.com/Y-E-T-I/p/8379700.html
Copyright © 2011-2022 走看看