题目描述

  给你\(n,m\),求所有\(n\)个点的简单无向图中每个点度数的\(m\)次方的和。

  \(n\leq {10}^9,m\leq {10}^5\)

题解

  \(g_n\)为\(n\)个点的无向图个数,\(f_n\)为\(n\)个点的答案。

\[\begin{align}
g_n&=2^{\binom{n}{2}}\\
f_n&=ng_{n-1}\sum_{i=0}^{n-1}\binom{n-1}{i}i^m\\
&=ng_{n-1}\sum_{i=0}^{n-1}\binom{n-1}{i}\sum_{j=0}^{i}\binom{i}{j}S(m,j)j!\\
&=ng_{n-1}\sum_{i=0}^{n-1}\sum_{j=0}^i\binom{n-1}{i}\binom{i}{j}S(m,j)j!\\
&=ng_{n-1}\sum_{i=0}^{n-1}\sum_{j=0}^i\binom{n-j}{j}\binom{n-1-i}{i-j}S(m,j)j!\\
&=ng_{n-1}\sum_{j=0}^m\binom{n-1}{j}S(m,j)j!\sum_{i=j}^{n-1}\binom{n-1-j}{i-j}\\
&=ng_{n-1}\sum_{j=0}^m{(n-1)}^\underline{j}S(m,j)2^{n-1-j}\\
\end{align}
\]

  用ntt算斯特林数

  时间复杂度:\(O(m\log m)\)

代码

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. #include<cstdlib>
  5. #include<ctime>
  6. #include<utility>
  7. using namespace std;
  8. typedef long long ll;
  9. typedef pair<int,int> pii;
  10. ll p=998244353;
  11. ll fp(ll a,ll b)
  12. {
  13. ll s=1;
  14. while(b)
  15. {
  16. if(b&1)
  17. s=s*a%p;
  18. a=a*a%p;
  19. b>>=1;
  20. }
  21. return s;
  22. }
  23. ll fc[300010];
  24. ll ifc[300010];
  25. ll a[300010];
  26. ll b[300010];
  27. int rev[300010];
  28. void ntt(ll *a,int n,int t)
  29. {
  30. ll u,v,w,wn;
  31. int i,j,k;
  32. rev[0]=0;
  33. for(i=1;i<n;i++)
  34. rev[i]=(rev[i>>1]>>1)|(i&1?n>>1:0);
  35. for(i=0;i<n;i++)
  36. if(rev[i]<i)
  37. swap(a[rev[i]],a[i]);
  38. for(i=2;i<=n;i<<=1)
  39. {
  40. if(t==1)
  41. wn=fp(3,(p-1)/i);
  42. else
  43. wn=fp(fp(3,(p-1)/i),p-2);
  44. for(j=0;j<n;j+=i)
  45. {
  46. w=1;
  47. for(k=j;k<j+i/2;k++)
  48. {
  49. u=a[k];
  50. v=a[k+i/2]*w%p;
  51. a[k]=(u+v)%p;
  52. a[k+i/2]=(u-v)%p;
  53. w=w*wn%p;
  54. }
  55. }
  56. }
  57. if(t==-1)
  58. {
  59. ll inv=fp(n,p-2);
  60. for(i=0;i<n;i++)
  61. a[i]=a[i]*inv%p;
  62. }
  63. }
  64. ll c[300010];
  65. int main()
  66. {
  67. // freopen("b.in","r",stdin);
  68. // freopen("b.out","w",stdout);
  69. int n,m;
  70. scanf("%d%d",&n,&m);
  71. fc[0]=fc[1]=ifc[0]=ifc[1]=1;
  72. int i;
  73. int t=min(n-1,m);
  74. for(i=2;i<=t;i++)
  75. {
  76. fc[i]=fc[i-1]*i%p;
  77. ifc[i]=ifc[i-1]*fp(i,p-2)%p;
  78. }
  79. for(i=0;i<=t;i++)
  80. {
  81. a[i]=(i&1?-1:1)*ifc[i];
  82. b[i]=fp(i,m)*ifc[i]%p;
  83. }
  84. int k=1;
  85. while(k<=2*t)
  86. k<<=1;
  87. ntt(a,k,1);
  88. ntt(b,k,1);
  89. for(i=0;i<k;i++)
  90. a[i]=a[i]*b[i]%p;
  91. ntt(a,k,-1);
  92. for(i=0;i<k;i++)
  93. a[i]=(a[i]%p+p)%p;
  94. ll ans=0;
  95. c[0]=1;
  96. for(i=1;i<=t;i++)
  97. c[i]=c[i-1]*(n-i)%p;
  98. for(i=0;i<=t;i++)
  99. ans=(ans+c[i]%p*a[i]%p*fp(2,n-1-i)%p)%p;
  100. ans=ans*n%p*fp(2,ll(n-1)*(n-2)/2%(p-1))%p;
  101. printf("%lld\n",ans);
  102. return 0;
  103. }

【XSY1301】原题的价值 第二类斯特林数 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. BZOJ5093 [Lydsy1711月赛]图的价值 【第二类斯特林数 + NTT】

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

  4. bzoj5093:图的价值(第二类斯特林数+NTT)

    传送门 首先,题目所求为\[n\times 2^{C_{n-1}^2}\sum_{i=0}^{n-1}C_{n-1}^ii^k\] 即对于每个点\(i\),枚举它的度数,然后计算方案.因为有\(n\) ...

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

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

  6. 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! ...

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

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

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

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

  9. BZOJ 4555:[TJOI2016&HEOI2016]求和(第二类斯特林数+NTT)

    题目链接 \(Description\) 求 \[\sum_{i=0}^n\sum_{j=0}^iS(i,j)2^jj!\]对998244353取模后的结果. \(n<=10^5\) \(Sol ...

随机推荐

  1. python之socket模块详解--小白博客

    主要是创建一个服务端,在创建服务端的时候,主要步骤如下:创建socket对象socket——>绑定IP地址和端口bind——>监听listen——>得到请求accept——>接 ...

  2. Vue基本使用和指令集

    Vue的使用 一.安装 对于新手来说,强烈建议大家使用<script>引入: 二. 引入vue.js文件 我们能发现,引入vue.js文件之后,Vue被注册为一个全局的变量,它是一个构造函 ...

  3. 多线程系列之二:Single Thread Execution 模式

    一,什么是SingleThreadExecution模式?同一时间内只能让一个线程执行处理 二,例子 1.不安全的情况 用程序模拟 三个人频繁地通过一个只允许一个人经过的门.当人通过时,统计人数便会增 ...

  4. java异常Exception

    学习笔记: 一.程序的异常:Throwable 严重问题:Error ,我们不处理.这种问题一般很严重,不如内存溢出 问题:Exception 编译问题:不是RuntimeException异常.必须 ...

  5. openstack,docker,mesos,k8s关系

    openstack,docker,mesos,k8s什么关系? - 知乎https://www.zhihu.com/question/62985699 OpenStack + K8S 环境集成测试ht ...

  6. Windows 10正式版历代记:Version 和 Build 对应关系

    2017年10月中下旬,微软面向正式版用户推送了Windows 10创意者更新秋季版.这是自发布以来,Windows 10的第五个大版本. 在这篇文章中,我们来回顾一下Windows 10正式版的历史 ...

  7. HTML中的几种空格

    HTML提供了5种空格实体(space entity),它们拥有不同的宽度,非断行空格( )是常规空格的宽度,可运行于所有主流浏览器.其他几种空格(       ‌‍)在不同浏览器中宽度各异.     ...

  8. HDU 4913 Least common multiple

    题目:Least common multiple 链接:http://acm.hdu.edu.cn/showproblem.php?pid=4913 题意:有一个集合s,包含x1,x2,...,xn, ...

  9. java之序列化

    详细内容 连接https://blog.csdn.net/qq_27093465/article/details/78544505 Java 之 Serializable 序列化和反序列化的概念,作用 ...

  10. Keras和tensorflow的区别

    参考: https://blog.csdn.net/zhangbaoanhadoop/article/details/82111056