• [bzoj5093]图的价值


    https://www.zybuluo.com/ysner/note/1287478

    题面

    “简单无向图”是指无重边、无自环的无向图(不一定连通)。
    一个带标号的图的价值定义为每个点度数的(k)次方的和。
    给定(n)(k),请计算所有(n)个点的带标号的简单无向图的价值之和。
    因为答案很大,请对(998244353)取模输出。

    • (nleq10^9,kleq2*10^5)

    解析

    毒瘤毒瘤大毒瘤。。。
    细节多得想吐。。。

    经过思考每个点连哪些边,可以发现答案为$$n2^{frac{n(n-1)}{2}-(n-1)}sum_{i=0}^{n-1}C(n-1,i)*i^k$$。

    前面可以注意一下的地方是那个指数。
    在模质数意义下我们是可以把它变小的。
    费马小定理:若(p)为质数,则$$a^{p-1}equiv1(mod p)$$
    一般我们用它求逆元,即(a^{p-2}equivfrac{1}{a}(mod p))
    但我们也可以用它化简指数,即(a^b=a^{b\%(p-1)}a^{p-1}=a^{b\%(p-1)}(mod p))

    后面那个式子我以前推过([CF932E]Team Work)。
    即$$sum_{i=1}^nC(n,i)i^k=sum_{i=1}^kS(k,i)frac{n!}{(n-i)!}*2^{n-i}$$

    [=sum_{i=1}^kS(k,i)*i!*C(n,i)*2^{n-i} ]

    然后思考怎么在(O(nlogn))的时间复杂度内求出(S(k,i))
    第二类斯特林数有个由容斥得来的公式:(通过枚举至少有几个空盒)

    [S(n,k)=frac{1}{k!}sum_{i=0}^k(-1)^iC(k,i)(k-i)^n ]

    化化简:

    [=frac{1}{k!}sum_{i=0}^k(-1)^i*frac{k!}{i!(k-i)!}(k-i)^n ]

    [=sum_{i=0}^kfrac{(-1)^i}{i!}frac{(k-i)^n}{(k-i)!} ]

    这样,把右边序列倒过来,就可以(NTT)啦。

    #include<iostream>
    #include<cstring>
    #include<cmath>
    #include<cstdio>
    #include<cstdlib>
    #include<algorithm>
    #define ll long long
    #define re register
    #define il inline
    #define fp(i,a,b) for(re int i=a;i<=b;i++)
    #define fq(i,a,b) for(re int i=a;i>=b;i--)
    using namespace std;
    const int N=8e5+100,mod=998244353;
    ll a[N],b[N],jc[N],ans,inv[N],jc2[N],p,C[N];
    int l,r[N],lim=1,n,m;
    il ll ksm(re ll S,re ll n)
    {
      re ll T=S;S=1;
      while(n)
        {
          if(n&1) S=S*T%mod;
          T=T*T%mod;
          n>>=1;
        }
      return S;
    }
    il void NTT(re ll *A,re int tp)
    {
      fp(i,1,lim-1) if(i<r[i]) swap(A[i],A[r[i]]);
      for(re int mid=1;mid<lim;mid<<=1)
        {
          re ll gu=mid<<1,W=ksm(3,(mod-1)/gu);
          if(tp==-1) W=ksm(W,mod-2);
          for(re int j=0;j<lim;j+=gu)
    	{
    	  re ll w=1;
              for(re int k=0;k<mid;++k,w=w*W%mod)
    	    {
    	      re ll x=A[j+k],y=w*A[j+mid+k]%mod;
    	      A[j+k]=(x+y)%mod;A[j+mid+k]=(x-y+mod)%mod;
    	    }
    	}
        }
    }
    il ll gi()
    {
      re ll x=0,t=1;
      re char ch=getchar();
      while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
      if(ch=='-') t=-1,ch=getchar();
      while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
      return x*t;
    }
    int main()
    {
      p=gi()-1;m=n=gi();
      jc[0]=inv[0]=1;fp(i,1,n) jc[i]=jc[i-1]*i%mod,inv[i]=ksm(jc[i],mod-2);//开始没有inv[0]=1
      re ll inv2=ksm(2,mod-2);
      C[0]=1;fp(i,1,n) C[i]=C[i-1]*(p-i+1)%mod*ksm(i,mod-2)%mod;
      jc2[0]=ksm(2,p);fp(i,1,n) jc2[i]=jc2[i-1]*inv2%mod;
      fp(i,0,n)
        {
          a[i]=(i&1)?mod-inv[i]:inv[i];
          b[i]=ksm(i,n)*inv[i]%mod;//一开始写的是p(这里在推S,p最后才用!!!)
        }
      while(lim<=n+m) lim<<=1,++l;
      fp(i,1,lim-1) r[i]=(r[i>>1]>>1)|((i&1)<<l-1);
      NTT(a,1);NTT(b,1);
      fp(i,0,lim-1) a[i]=a[i]*b[i]%mod;
      NTT(a,-1);
      re ll Inv=ksm(lim,mod-2);
      fp(i,0,n) (ans+=a[i]*Inv%mod*jc[i]%mod*C[i]%mod*jc2[i]%mod)%=mod;
      (ans*=(p+1)*ksm(2,((ll)(p+1)*p/2-p)%(mod-1))%mod)%=mod;
      printf("%lld
    ",ans);
      return 0;
    }
    
  • 相关阅读:
    数据库连接池
    数据库操作
    cookie/session
    楼梯问题
    Response/Request
    Web
    Exception
    jQuery效果与事件方法
    jQuery基础知识点
    布局的几种形式
  • 原文地址:https://www.cnblogs.com/yanshannan/p/9675262.html
Copyright © 2020-2023  润新知