bzoj5093: [Lydsy1711月赛]图的价值

不难想到考虑每个点的贡献,ans=n*sigema(1~n)i C(n-1,i)*(2^C(n-1,2))*i^k

直接套第二类斯特林拆柿子即可。提示:sigema(1~n)i C(n,i)*C(i,j) = C(n,j)*2^(n-j)

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long LL;
const int _=1e2;
const int maxK=2e5+_;
const int fbiK=(1<<18)+_;
const int mod=998244353;
inline int ad(int x,int y){return (x>=mod-y)?(x-mod+y):x+y;}
inline int re(int x,int y){return (x<y)?(x-y+mod):x-y;}
inline int mu(int x,int y){return (LL)x*y%mod;}
inline int qp(int x,int y){int r=1;while(y>0){if(y&1)r=mu(r,x);x=mu(x,x);y/=2;}return r;}

int fac[maxK],fac_inv[maxK],inv[maxK];
void yu(int K)
{
    fac[0]=1;for(int i=1;i<=K;i++)fac[i]=mu(fac[i-1],i);
    fac_inv[K]=qp(fac[K],mod-2);
    for(int i=K-1;i>=0;i--)fac_inv[i]=mu(fac_inv[i+1],i+1);
    
    inv[1]=1;for(int i=2;i<=K;i++)inv[i]=mu(inv[mod%i],mod-mod/i);
}

namespace GETS2
{
    int Re[2*fbiK];
    void NTT(int *a,int n,int op)
    {
        for(int i=0;i<n;i++)
            if(i<Re[i])swap(a[i],a[Re[i]]);
        for(int i=1;i<n;i<<=1)
        {
            int gn=qp(3,(mod-1)/(i<<1));
            if(op==-1)gn=qp(gn,mod-2);
            for(int j=0;j<n;j+=(i<<1))
            {
                int g=1;
                for(int k=0;k<i;k++,g=mu(g,gn))
                {
                    int k1=a[j+k],k2=mu(a[j+k+i],g);
                    a[j+k]=ad(k1,k2);
                    a[j+k+i]=re(k1,k2);
                }
            }
        }
        if(op==-1)
        {
            int inv=qp(n,mod-2);
            for(int i=0;i<n;i++)a[i]=mu(a[i],inv);
        }
    }
    int n,m,L,A[2*fbiK],B[2*fbiK],S2K[2*fbiK];
    void main(int K)
    {
        m=2*K-1;for(n=1;n<=m;n<<=1)L++;
        for(int i=0;i<n;i++)Re[i]=(Re[i>>1]>>1)|((i&1)<<(L-1));
        
        for(int i=0;i<=K;i++)
        {
            A[i]=mu((i&1)?mod-1:1,fac_inv[i]);
            B[i]=mu(qp(i,K),fac_inv[i]);
        }
                
        NTT(A,n,1),NTT(B,n,1);
        for(int i=0;i<n;i++)S2K[i]=mu(A[i],B[i]);
        NTT(S2K,n,-1);
    }
}
int S2[1100][1100];
void QWQ()
{
    S2[0][0]=1;
    for(int i=1;i<=100;i++)
        for(int j=1;j<=i;j++)
            S2[i][j]=ad(S2[i-1][j-1],mu(S2[i-1][j],j));
}

int main()
{
    int n,K;
    scanf("%d%d",&n,&K);yu(K);
    GETS2::main(K);//QWQ();
    
    using namespace GETS2;
    int ans=0,C=1;
    for(int j=1;j<=K;j++)
    {
        C=mu(mu(C,n-j),inv[j]);
        ans=ad(ans, mu( mu(S2K[j],fac[j]) , mu(C,qp(2,n-1-j)) ) );
    }
    printf("%d\n", mu( mu(ans,n) , qp(2,(LL)(n-1)*(n-2)/2%(mod-1)) ) );
    
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/AKCqhzdy/p/10762425.html