题目链接

BZOJ5093

题解

点之间是没有区别的,所以我们可以计算出一个点的所有贡献,然后乘上\(n\)

一个点可能向剩余的\(n - 1\)个点连边,那么就有

\[ans = 2^{{n - 1 \choose 2}}n \sum\limits_{i = 0}^{n - 1} {n - 1 \choose i} i^k
\]

显然要求

\[\sum\limits_{i = 0}^{n} {n \choose i} i^k
\]

然后我就不知道怎么做了。。

翻翻题解

有这样一个结论:

\[n^k = \sum\limits_{i = 0}^{k} \begin{Bmatrix} k \\ i \end{Bmatrix} {n \choose i} i!
\]

那么就有

\[\begin{aligned}
\sum\limits_{i = 0}^{n} {n \choose i} i^k &= \sum\limits_{i = 0}^{n} {n \choose i} \sum\limits_{j = 0}^{i} \begin{Bmatrix} k \\ j \end{Bmatrix} {i \choose j}j! \\
&= \sum\limits_{j = 0}^{n}\begin{Bmatrix} k \\ j \end{Bmatrix} j! \sum\limits_{i = j}^{n} {n \choose i} {i \choose j} \\
&= \sum\limits_{j = 0}^{n}\begin{Bmatrix} k \\ j \end{Bmatrix} j! {n \choose j} 2^{n - j} \\
\end{aligned}
\]

解释一下最后一步

\[\sum\limits_{i = j}^{n} {n \choose i} {i \choose j}
\]

直观来看是从\(n\)中取出\(i\)个,然后从\(i\)中取出\(j\)个

实际上等价于从\(n\)中取出\(j\)个,剩余随便取

最后只需要求出第二类斯特林数,用第二类斯特林反演即可

\[\begin{aligned}
\begin{Bmatrix} n \\ m \end{Bmatrix} &= \frac{1}{m!} \sum\limits_{i = 0}^{m} (-1)^{i}{m \choose i}(m - i)^{n} \\
&= \sum\limits_{i = 0}^{m} \frac{(-1)^{i}}{i!} \times \frac{(m - i)^{n}}{(m - i)!} \\
\end{aligned}
\]

\(NTT\)即可

  1. #include<algorithm>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<cstdio>
  5. #include<cmath>
  6. #include<map>
  7. #define Redge(u) for (int k = h[u],to; k; k = ed[k].nxt)
  8. #define REP(i,n) for (int i = 1; i <= (n); i++)
  9. #define mp(a,b) make_pair<int,int>(a,b)
  10. #define cls(s) memset(s,0,sizeof(s))
  11. #define cp pair<int,int>
  12. #define LL long long int
  13. using namespace std;
  14. const int maxn = 800005,maxm = 100005,INF = 1000000000;
  15. inline int read(){
  16. int out = 0,flag = 1; char c = getchar();
  17. while (c < 48 || c > 57){if (c == '-') flag = -1; c = getchar();}
  18. while (c >= 48 && c <= 57){out = (out << 3) + (out << 1) + c - 48; c = getchar();}
  19. return out * flag;
  20. }
  21. const int G = 3,P = 998244353;
  22. inline int qpow(int a,LL b){
  23. int re = 1;
  24. for (; b; b >>= 1,a = 1ll * a * a % P)
  25. if (b & 1) re = 1ll * re * a % P;
  26. return re;
  27. }
  28. int R[maxn];
  29. void NTT(int* a,int n,int f){
  30. for (int i = 0; i < n; i++) if (i < R[i]) swap(a[i],a[R[i]]);
  31. for (int i = 1; i < n; i <<= 1){
  32. int gn = qpow(G,(P - 1) / (i << 1));
  33. for (int j = 0; j < n; j += (i << 1)){
  34. int g = 1,x,y;
  35. for (int k = 0; k < i; k++,g = 1ll * g * gn % P){
  36. x = a[j + k],y = 1ll * g * a[j + k + i] % P;
  37. a[j + k] = (x + y) % P,a[j + k + i] = ((x - y) % P + P) % P;
  38. }
  39. }
  40. }
  41. if (f == 1) return;
  42. int nv = qpow(n,P - 2); reverse(a + 1,a + n);
  43. for (int i = 0; i < n; i++) a[i] = 1ll * a[i] * nv % P;
  44. }
  45. int fac[maxn],inv[maxn],fv[maxn],C[maxn];
  46. int S[maxn],B[maxn],N,K;
  47. void init(){
  48. fac[0] = fac[1] = inv[0] = inv[1] = fv[0] = fv[1] = 1;
  49. for (int i = 2; i <= K; i++){
  50. fac[i] = 1ll * fac[i - 1] * i % P;
  51. inv[i] = 1ll * (P - P / i) * inv[P % i] % P;
  52. fv[i] = 1ll * fv[i - 1] * inv[i] % P;
  53. }
  54. C[0] = 1; int E = min(N - 1,K);
  55. for (int i = 1; i <= E; i++) C[i] = 1ll * C[i - 1] * (N - i) % P * inv[i] % P;
  56. }
  57. void work(){
  58. int n = 1,L = 0;
  59. for (int i = 0; i <= K; i++){
  60. S[i] = (((i & 1) ? -1 : 1) * fv[i] + P) % P;
  61. B[i] = 1ll * qpow(i,K) * fv[i] % P;
  62. }
  63. while (n <= (K << 1)) n <<= 1,L++;
  64. for (int i = 1; i < n; i++) R[i] = (R[i >> 1] >> 1) | ((i & 1) << (L - 1));
  65. NTT(S,n,1); NTT(B,n,1);
  66. for (int i = 0; i < n; i++) S[i] = 1ll * S[i] * B[i] % P;
  67. NTT(S,n,-1);
  68. //REP(i,10) printf("%d ",S[i]); puts("");
  69. int ans = 0;
  70. for (int i = 0; i < N; i++){
  71. if (i > K) break;
  72. ans = (ans + 1ll * S[i] * fac[i] % P * C[i] % P * qpow(2,N - 1 - i) % P) % P;
  73. }
  74. ans = 1ll * ans * N % P * qpow(2,1ll * (N - 1) * (N - 2) / 2) % P;
  75. printf("%d\n",ans);
  76. }
  77. int main(){
  78. N = read(); K = read();
  79. if (N == 1){puts("0"); return 0;}
  80. if (N == 2){puts("2"); return 0;}
  81. init();
  82. work();
  83. return 0;
  84. }

BZOJ5093 [Lydsy1711月赛]图的价值 【第二类斯特林数 + NTT】的更多相关文章

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

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

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

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

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

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

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

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

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

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

  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. Hadoop、Yarn和vcpu资源的配置

    转载自:https://www.cnblogs.com/S-tec-songjian/p/5740691.html Hadoop  YARN同时支持内存和CPU两种资源的调度(默认只支持内存,如果想进 ...

  2. ORM框架-SQLAchemy使用

    一.ORM简介 orm英文全称object relational mapping,就是对象映射关系程序,简单来说我们类似python这种面向对象的程序来说一切皆对象,但是我们使用的数据库却都是关系型的 ...

  3. 20155202张旭 Exp7 网络欺诈技术防范

    20155202张旭 Exp7 网络欺诈技术防范 基础问题回答 通常在什么场景下容易受到DNS spoof攻击? 在同一局域网下比较容易受到DNS spoof攻击,攻击者可以冒充域名服务器,来发送伪造 ...

  4. 20155226《网络攻防》 Exp5 MSF基础应用

    20155226<网络攻防> Exp5 MSF基础应用 基础问题回答 1.用自己的话解释什么是exploit,payload,encode? exploit : Exploit的英文意思就 ...

  5. # 2017-2018-2 20155319『网络对抗技术』Exp4:恶意代码分析

    2017-2018-2 20155319『网络对抗技术』Exp4:恶意代码分析 实验目标与基础问题 ++1.实践目标++ 监控你自己系统的运行状态,看有没有可疑的程序在运行. 分析一个恶意软件,就分析 ...

  6. # 20155319 Exp3 免杀原理与实践

    20155319 Exp3 免杀原理与实践 基础问题 (1)杀软是如何检测出恶意代码的? 基于特征码的检测 启发式的恶意软件检测 基于行为的恶意软件检测 (2)免杀是做什么? 免杀,从字面进行理解,避 ...

  7. JavaScript快速入门-ECMAScript本地对象(Date)

    JavaScript中的Date 对象用于处理日期和时间. var myDate=new Date()  #Date 对象会自动把当前日期和时间保存为其初始值. 一.Date对象的方法 方法 示例 n ...

  8. WPF DataGrid列设置为TextBox控件的相关绑定

    在wpf的DataGrid控件中,某一列的数据模板为TextBox控件的话,绑定Text="{Binding TxtSn, UpdateSourceTrigger=PropertyChang ...

  9. Markdown基本使用方法

    最近开通了博客,看到网上好多推荐markdown的,而且博客园支持markdown,所以决定学习一下. 百度百科对markdown的介绍: Markdown是一种可以使用普通文本编辑器编写的标记语言, ...

  10. 手机Gmail上用Exchange协议配置收发QQ邮箱

    1.开启Exchange服务  2.生成授权码(登录密码)  3."服务器"填入ex.qq.com