zoukankan      html  css  js  c++  java
  • 【xsy1301】 原题的价值 组合数+斯特林数+FFT

    题目大意:求$n imes2^{frac{(n-1)(n-2)/2}{2}}sumlimits_{i=0}^{n-1}dbinom{n-1}{i}i^k$

    数据范围:$n≤10^9$,$k≤10^5$,答案对$998244353$取模。


    我们令$F(n,k)=sumlimits_{i=0}^{n-1}inom{n-1}{i}i^k$。

    那么最终要输出的东西显然就是$n imes2^{frac{(n-1)(n-2)/2}{2}}F(n,k)$

    我们令$G(n,k)=(n-1)^underline{k}2^{n-1-k}$

    我们先考虑下当$k=0$的时候要怎么做,我们显然有:

    $F(n,0)=sumlimits_{i=0}^{n-1}inom{n-1}{i}=2^{n-1}$

    化简是根据二项式定理来的,在此不展开说了。

    考虑下当$k=1$的时候要怎么做:

    $F(n,1)=sumlimits_{i=0}^{n-1}dbinom{n-1}{i}i
    \
    =sumlimits_{i=0}^{n-1}dfrac{(n-1)!}{i!(n-1-i)!}i
    \
    =sumlimits_{i=1}^{n-1}dfrac{(n-1)!}{(i-1)!(n-1-i)!}
    \
    =sumlimits_{i=1}^{n-1}dfrac{(n-1)!}{(i-1)!((n-2)-(i-1))!}
    \
    =(n-1)sumlimits_{i=1}^{n-1}dfrac{(n-2)!}{(i-1)!((n-2)-(i-1))!}
    \
    =(n-1)sumlimits_{i=1}^{n-1}dbinom{n-2}{i-1}
    \
    =(n-1)F(n-1,0)=G(n,1)$

    我们考虑按照$k=1$的化简方法来化简$k=2$,由于跟上文比较相似,所以可能会有不少的跳步

    $F(n,2)=sumlimits_{i=0}^{n-1}dbinom{n-1}{i}i^2$

    $=sumlimits_{i=0}^{n-1}dfrac{(n-1)!}{i!(n-1-i)!}i^2$

    $=(n-1)sumlimits_{i=1}^{n-1}dbinom{n-2}{i-1}i$

    $=(n-1)sumlimits_{i=1}^{n-1}dfrac{(n-2)!}{(i-1)!ig((n-2)-(i-1)ig)!}ig((i-1)+1ig)$

    $=F(n-1,1)+(n-1)sumlimits_{i=1}^{n-1}dfrac{(n-2)!}{(i-2)!ig((n-3)-(i-2)ig)!}$

    $=F(n-1,1)+(n-1)(n-2)sumlimits_{i=1}^{n-1}dfrac{(n-3)!}{(i-2)!ig((n-3)-(i-2)ig)!}$

    $=F(n-1,1)+(n-1)(n-2)F(n-2,0)$

    $=G(n,1)+G(n,2)$

     
    根据k=2的推法,我们推出了$k=3$和$k=4$的情况:

    $F(n,3)=G(n,1)+3G(n,2)+4G(n,3)$

    $F(n,4)=G(n,1)+7G(n,2)+6G(n,3)+G(n,4)$

    诶?这不是斯特林三角形吗(证明显然,这里不证了)

    于是有:

    $F(n,m)=sumlimits_{i=1}^{m}S2(n,i)G(n,i)$

    $G(n,1cdots k)$可以在$O(k)$的时间复杂度内求出来,$S2(n,1cdots k)$可以在$O(klog k)$的复杂度内用FFT求出来。

    完结撒花~

     1 #include<bits/stdc++.h>
     2 #define MOD 998244353
     3 #define L long long
     4 #define M (1<<18)
     5 #define G 3
     6 using namespace std;
     7 
     8 L fac[M]={0},invfac[M]={0};
     9 L pow_mod(L x,L k){L ans=1;for(;k>0;k>>=1,x=x*x%MOD) if(k&1) ans=ans*x%MOD; return ans;}
    10 L C(int n,int m){return fac[n]*invfac[m]%MOD*invfac[n-m]%MOD;}
    11 
    12 void change(L a[],int n){
    13     for(int i=0,j=0;i<n-1;i++){
    14         if(i<j) swap(a[i],a[j]);
    15         int k=n>>1;
    16         while(j>=k) j-=k,k>>=1;
    17         j+=k;
    18     }
    19 }
    20 void NTT(L a[],int n,int on){
    21     change(a,n);
    22     for(int h=2;h<=n;h<<=1){
    23         L wn=pow_mod(G,(MOD-1)/h);
    24         for(int j=0;j<n;j+=h){
    25             L w=1;
    26             for(int k=j;k<j+(h>>1);k++){
    27                 L u=a[k],t=a[k+(h>>1)]*w%MOD;
    28                 a[k]=(u+t)%MOD;
    29                 a[k+(h>>1)]=(u-t+MOD)%MOD;
    30                 w=w*wn%MOD;
    31             }
    32         }
    33     }
    34     if(on==-1){
    35         reverse(a+1,a+n);
    36         L INV=pow_mod(n,MOD-2);
    37         for(int i=0;i<n;i++) a[i]=a[i]*INV%MOD;
    38     }
    39 }
    40 L a[M]={0},b[M]={0},s[M]={0},nc[M]={0};
    41 
    42 int main(){
    43     fac[0]=1; for(int i=1;i<M;i++) fac[i]=fac[i-1]*i%MOD;
    44     invfac[M-1]=pow_mod(fac[M-1],MOD-2);
    45     for(int i=M-2;~i;i--) invfac[i]=invfac[i+1]*(i+1)%MOD;
    46     L n,k,ans=0; cin>>n>>k;
    47     if(k==0) return printf("%lld
    ",n*pow_mod(2,(n-1)*n/2)%MOD);
    48     for(L i=0,mul=1;i<k;i++){
    49         mul=mul*(n-i-1)%MOD;
    50         nc[i+1]=mul*pow_mod(2,n-i-2)%MOD;
    51     }
    52     for(int i=0;i<=k;i++){
    53         a[i]=pow_mod(MOD-1,i)*invfac[i]%MOD;
    54         b[i]=pow_mod(i,k)*invfac[i]%MOD;
    55     }
    56     int len=1; while(k*2>=len) len<<=1;
    57     NTT(a,len,1); NTT(b,len,1);
    58     for(int i=0;i<len;i++) s[i]=a[i]*b[i]%MOD;
    59     NTT(s,len,-1);
    60     for(int i=k+1;i<len;i++) s[i]=0;
    61     
    62     for(int i=1;i<=k;i++)
    63     (ans+=nc[i]*s[i])%=MOD;
    64     
    65     cout<<ans*n%MOD*pow_mod(2,(n*(n-1)/2-(n-1)))%MOD<<endl;
    66 }
  • 相关阅读:
    Goolge-Guava Concurrent中的Service
    Golang操作数据库
    HttpContext
    office 问题集
    C# 日志使用
    字符编解码的故事 字符集 GBK GB2312 GB18030 Unicode 的由来和区别
    TCP UDP 协议的选择
    WebService 学习总结
    WebService 学习过程
    Archery:开源漏洞评估和管理工具
  • 原文地址:https://www.cnblogs.com/xiefengze1/p/10809207.html
Copyright © 2011-2022 走看看