zoukankan      html  css  js  c++  java
  • 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
    ", mu( mu(ans,n) , qp(2,(LL)(n-1)*(n-2)/2%(mod-1)) ) );
        
        return 0;
    }
  • 相关阅读:
    2016Wireshark
    移动UI
    Javascript 严格模式详解
    [转]深入浅出JSONP解决ajax跨域问题
    savedev和save的区别
    jquery各版本区别
    Webpack学习笔记(一)
    Html5新特性
    chrome浏览器debug
    bootstrap笔记
  • 原文地址:https://www.cnblogs.com/AKCqhzdy/p/10762425.html
Copyright © 2011-2022 走看看