传送门

首先,题目所求为$$n\times 2{C_{n-1}2}\sum_{i=0}{n-1}C_{n-1}ii^k$$

即对于每个点\(i\),枚举它的度数,然后计算方案。因为有\(n\)个点,且关于某个点连边的时候剩下的边都可以随便连,所以有前面的两个常数

所以真正要计算的是$$\sum_{i=0}{n-1}C_{n-1}ii^k$$

根据第二类斯特林数的性质,有$$ik=\sum_{j=0}iS(k,j)\times j!\times C_i^j$$

然后带入,得$$\sum_{i=0}{n-1}C_{n-1}i\sum_{j=0}^iS(k,j)\times j!\times C_i^j$$

把\(j\)提到前面来$$\sum_{j=0}^{n-1}j!\times S(k,j)\sum_{i=j}{n-1}C_{n-1}iC_i^j$$

后面那个\(\sum_{i=j}^{n-1}C_{n-1}^iC_i^j\),可以理解为从\(n-1\)个数中选\(i\)个,再从这\(i\)个中选\(j\)个的方案数,等价于这\(j\)个必选,剩下的\(n-1-i\)个可选可不选,于是有$$\sum_{j=0}^{n-1}j!\times S(k,j)\times C_{n-1}^j\times 2^{n-j-1}$$

\[\sum_{j=0}^{n-1}S(k,j)\times \frac{(n-1)!}{(n-1-j)!}\times 2^{n-j-1}
\]

然后因为第二类斯特林数的通项公式为$$S(n,m)=\frac{1}{m!}\sum_{k=0}{m}(-1)kC(m,k)(m-k)^n$$

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

于是第二类斯特林数也能表示成卷积的形式,对于\(S(k,j)\),当\(j>k\)时恒为\(0\),所以只要计算到\(k\)位置即可。预处理出第二类斯特林数,然后更新答案,复杂度为\(O(k\log k)\)

  1. //minamoto
  2. #include<bits/stdc++.h>
  3. #define R register
  4. #define ll long long
  5. #define fp(i,a,b) for(R int i=a,I=b+1;i<I;++i)
  6. #define fd(i,a,b) for(R int i=a,I=b-1;i>I;--i)
  7. #define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
  8. using namespace std;
  9. char buf[1<<21],*p1=buf,*p2=buf;
  10. inline char getc(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
  11. int read(){
  12. R int res,f=1;R char ch;
  13. while((ch=getc())>'9'||ch<'0')(ch=='-')&&(f=-1);
  14. for(res=ch-'0';(ch=getc())>='0'&&ch<='9';res=res*10+ch-'0');
  15. return res*f;
  16. }
  17. char sr[1<<21],z[20];int C=-1,Z=0;
  18. inline void Ot(){fwrite(sr,1,C+1,stdout),C=-1;}
  19. void print(R int x){
  20. if(C>1<<20)Ot();if(x<0)sr[++C]='-',x=-x;
  21. while(z[++Z]=x%10+48,x/=10);
  22. while(sr[++C]=z[Z],--Z);sr[++C]='\n';
  23. }
  24. const int N=6e5+5,P=998244353,Gi=332748118;
  25. inline int add(R int x,R int y){return x+y>=P?x+y-P:x+y;}
  26. inline int dec(R int x,R int y){return x-y<0?x-y+P:x-y;}
  27. inline int mul(R int x,R int y){return 1ll*x*y-1ll*x*y/P*P;}
  28. int ksm(R int x,R ll y){
  29. R int res=1;
  30. for(;y;y>>=1,x=mul(x,x))if(y&1)res=mul(res,x);
  31. return res;
  32. }
  33. int A[N],B[N],O[N],r[N],S[N],fac[N],inv[N];
  34. int n,m,lim,l,k,ans;
  35. void NTT(int *A,int ty){
  36. fp(i,0,lim-1)if(i<r[i])swap(A[i],A[r[i]]);
  37. for(R int mid=1;mid<lim;mid<<=1){
  38. R int I=(mid<<1),Wn=ksm(ty==1?3:Gi,(P-1)/I);O[0]=1;
  39. fp(i,1,mid-1)O[i]=mul(O[i-1],Wn);
  40. for(R int j=0;j<lim;j+=I)fp(k,0,mid-1){
  41. int x=A[j+k],y=mul(O[k],A[j+k+mid]);
  42. A[j+k]=add(x,y),A[j+k+mid]=dec(x,y);
  43. }
  44. }if(ty==-1)for(R int i=0,inv=ksm(lim,P-2);i<lim;++i)A[i]=mul(A[i],inv);
  45. }
  46. int main(){
  47. // freopen("testdata.in","r",stdin);
  48. n=read(),k=read();
  49. fac[0]=inv[0]=1;
  50. fp(i,1,k)fac[i]=mul(fac[i-1],i);
  51. inv[k]=ksm(fac[k],P-2);fd(i,k-1,1)inv[i]=mul(inv[i+1],i+1);
  52. fp(i,0,k){
  53. A[i]=i&1?P-inv[i]:inv[i];
  54. B[i]=mul(ksm(i,k),inv[i]);
  55. }lim=1;while(lim<=k+k)lim<<=1,++l;
  56. fp(i,0,lim-1)r[i]=(r[i>>1]>>1)|((i&1)<<(l-1));
  57. NTT(A,1),NTT(B,1);
  58. fp(i,0,lim-1)A[i]=mul(A[i],B[i]);
  59. NTT(A,-1);
  60. fp(i,0,k)S[i]=A[i];
  61. int inv2=ksm(2,P-2);
  62. for(R int i=0,j=ksm(2,n-1),p=1;i<=min(n-1,k);++i){
  63. ans=add(ans,1ll*S[i]*j%P*p%P);
  64. j=mul(j,inv2),p=mul(p,n-i-1);
  65. }
  66. ans=mul(ans,n),ans=mul(ans,ksm(2,1ll*(n-1)*(n-2)/2));
  67. printf("%d\n",ans);return 0;
  68. }

bzoj5093:图的价值(第二类斯特林数+NTT)的更多相关文章

  1. BZOJ 5093: [Lydsy1711月赛]图的价值 第二类斯特林数+NTT

    定义有向图的价值为图中每一个点的度数的 \(k\) 次方之和. 求:对于 \(n\) 个点的无向图所有可能情况的图的价值之和. 遇到这种题,八成是每个点单独算贡献,然后累加起来. 我们可以枚举一个点的 ...

  2. bzoj 5093 图的价值 —— 第二类斯特林数+NTT

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=5093 每个点都是等价的,从点的贡献来看,得到式子: \( ans = n * \sum\li ...

  3. bzoj 5093 [Lydsy1711月赛]图的价值——第二类斯特林数

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=5093 不要见到组合数就拆! 枚举每个点的度数,则答案为 \( n*\sum\limits_{ ...

  4. 【XSY1301】原题的价值 第二类斯特林数 NTT

    题目描述 给你\(n,m\),求所有\(n\)个点的简单无向图中每个点度数的\(m\)次方的和. \(n\leq {10}^9,m\leq {10}^5\) 题解 \(g_n\)为\(n\)个点的无向 ...

  5. BZOJ5093 [Lydsy1711月赛]图的价值 【第二类斯特林数 + NTT】

    题目链接 BZOJ5093 题解 点之间是没有区别的,所以我们可以计算出一个点的所有贡献,然后乘上\(n\) 一个点可能向剩余的\(n - 1\)个点连边,那么就有 \[ans = 2^{{n - 1 ...

  6. BZOJ4555 [Tjoi2016&Heoi2016]求和 【第二类斯特林数 + NTT】

    题目 在2016年,佳媛姐姐刚刚学习了第二类斯特林数,非常开心. 现在他想计算这样一个函数的值: S(i, j)表示第二类斯特林数,递推公式为: S(i, j) = j ∗ S(i − 1, j) + ...

  7. bzoj 4555 [Tjoi2016&Heoi2016] 求和 —— 第二类斯特林数+NTT

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4555 关于第二类斯特林数:https://www.cnblogs.com/Wuweizhen ...

  8. 【BZOJ4555】【TJOI2016】【HEOI2016】求和 (第二类斯特林数+NTT卷积)

    Description 在2016年,佳媛姐姐刚刚学习了第二类斯特林数,非常开心. 现在他想计算这样一个函数的值: $$f(n)=\sum_{i=0}^n\sum_{j=0}^i S(i,j)\tim ...

  9. P4091 [HEOI2016/TJOI2016]求和(第二类斯特林数+NTT)

    传送门 首先,因为在\(j>i\)的时候有\(S(i,j)=0\),所以原式可以写成\[Ans=\sum_{i=0}^n\sum_{j=0}^nS(i,j)\times 2^j\times j! ...

随机推荐

  1. TEA对称加密算法

    今天在看<Distributed Systems Concepts and Design>这本书的时候,在讲到分布式系统的安全性的时候,给出了TEA算法,书本上有现成的代码,所以摘录下来以 ...

  2. java会不会出现内存泄露

    1 什么是java内存泄露 当java中的对象生命周期已经结束,本应该释放,但是却长时间不能被释放时,也就是说,内存被浪费了,就是内存泄露. 2 java内存泄露的根本原因 长生命周期的对象中持有短生 ...

  3. request,session,application三者关系<转>

    几乎所有的Web开发语言都支持Session功能,Servlet也不例外. Servlet/JSP中的Session功能是通过作用域(scope)这个概念来实现的. 对象作用域为:  page  在当 ...

  4. select监听多个client -- linux函数

    使用select函数能够以非堵塞的方式和多个socket通信.程序仅仅是演示select函数的使用,功能很easy,即使某个连接关闭以后也不会改动当前连接数.连接数达到最大值后会终止程序. 1. 程序 ...

  5. Hibernate ManyToOne Mappings 多对一关联映射

    Hibernate ManyToOne Mappings 多对一关联映射 Hibernate框架的使用步骤: 1.创建Hibernate的配置文件(hibernate.cfg.xml)2.创建持久化类 ...

  6. [haoi2014]穿越封锁线

    这题需要注意的一点是射线法需要考虑边界,而且题目对边界的限制极为严格. dcmp(v[i%n].x-x)<=0&&dcmp(v[(i+1)%n].x-x)>0 dcmp(v ...

  7. 转载的C#学习笔记

    转载地址:http://www.cnblogs.com/renyanlei/p/4075065.html 最近在一个培训机构里面教授Net知识.每天都会带领学生学习c#知识.我希望把每天学习的笔记记录 ...

  8. jmeter使用笔记——流程及常用组件配置

    添加线程组 线程数 :对应用户数, Ramp-Up: 多少秒启动这些线程,1秒代表1秒内启动设置的线程数,10秒代表10秒内启动线程数 循环次数: 每个线程执行线程组内的请求循环次数 调度器:可以对线 ...

  9. 动态注册BroadcastReceiver

    1. [代码][Java]代码      package com.zjt.innerreceiver;   import android.app.Service; import android.con ...

  10. Android5.0 CheckBox颜色修改

    Android5.0开始,CheckBox带有material design动画效果,其默认的样式如下图所示: 可以看到,在上图中,CheckBox的边框为灰色,当被选中后,填充色为绿色. 那么如果我 ...