第二类斯特林数模版题

需要一些组合数的小$ trick$

upd:这里更新了本题巧妙的$ O(k)$做法,虽然常数很大就是了


传送门:here

题意:求所有$ n$个节点的无重边自环图的价值和,定义一张图的价值为每个点度数的$ k$次方和,点有标号


$ Solution$

显然每个节点的贡献是独立的

枚举每个节点的度数,和这个点不联通的边可连可不连

$ ans=n*2^{\frac{(n-1)(n-2)}{2}}\ \ \sum\limits_{i=0}^{n-1}i^kC_{n-1}^i$

我们实际要求解的东西就是$ f(n,m)=\sum\limits_{i=0}^ni^mC_n^i$

把$i^m$用斯特林数展开得
$f(n,m)=\sum\limits_{i=0}^n\sum\limits_{j=0}^mC_i^jS(m,j)j!C_n^i$

把$j$移动到前面得
$f(n,m)=\sum\limits_{j=0}^mS(m,j)j!\sum\limits_{i=0}^nC_i^jC_n^i$
考虑后面这个$\sum\limits_{i=0}^nC_i^jC_n^i$是什么
本质相当于在$n$个物品中选出集合$A$,再在集合$A$中选取$j$个物品
也就是在$n$个物品中选取$j$个物品,其他$n-j$个物品可在集合$A$中也可不在
因此$\sum\limits_{i=0}^nC_i^jC_n^i=C_n^j2^{n-j}$
$f(n,m)=\sum\limits_{j=0}^mS(m,j)j!C_n^j2^{n-j}$
$NTT$筛出斯特林数直接计算即可
复杂度$O(k \ log \ k)$


$my \ code$

  1. #include<ctime>
  2. #include<cmath>
  3. #include<cstdio>
  4. #include<cstring>
  5. #include<iostream>
  6. #include<algorithm>
  7. #include<queue>
  8. #define p 998244353
  9. #define file(x)freopen(x".in","r",stdin);freopen(x".out","w",stdout)
  10. #define rt register int
  11. #define ll long long
  12. using namespace std;
  13. inline ll read(){
  14. ll x = ; char zf = ; char ch = getchar();
  15. while (ch != '-' && !isdigit(ch)) ch = getchar();
  16. if (ch == '-') zf = -, ch = getchar();
  17. while (isdigit(ch)) x = x * + ch - '', ch = getchar(); return x * zf;
  18. }
  19. void write(ll y){if(y<)putchar('-'),y=-y;if(y>)write(y/);putchar(y%+);}
  20. void writeln(const ll y){write(y);putchar('\n');}
  21. int i,j,k,m,n,x,y,z,cnt;
  22. int a[],b[],R[],lim;
  23. ll ksm(ll x,ll y){
  24. if(!y)return ;ll ew=;
  25. while(y>){
  26. if(y&)y--,ew=x*ew%p;
  27. y>>=,x=x*x%p;
  28. }return x*ew%p;
  29. }
  30. int inv[],S[];
  31. struct poly{
  32. int n,m,lim;
  33. void init(int k){
  34. //a[i]=(-1)^i / i! b[i] = i^k/i!
  35. n=k;
  36. a[]=;b[]=;
  37. for(rt i=;i<=k;i++){
  38. a[i]=-1ll*a[i-]*inv[i]%p;
  39. b[i]=ksm(i,k)*a[i]%p;
  40. if(i&)b[i]=-b[i];
  41. }
  42. lim=;while(lim<=n+n)lim<<=;
  43. for(rt i=;i<lim;i++)R[i]=(R[i>>]>>)|(i&?(lim>>):);
  44. }
  45. void NTT(int *A,int fla){
  46. for(rt i=;i<lim;i++)if(i<R[i])swap(A[i],A[R[i]]);
  47. for(rt i=;i<lim;i<<=){
  48. ll w=ksm(,p//i);
  49. for(rt j=;j<lim;j+=i<<){
  50. ll K=;
  51. for(rt k=;k<i;k++,K=K*w%p){
  52. ll x=A[j+k],y=K*A[i+j+k];
  53. A[j+k]=(x+y)%p;A[i+j+k]=(x-y)%p;
  54. }
  55. }
  56. }
  57. if(fla==-){
  58. reverse(A+,A+lim);
  59. for(rt i=;i<=n;i++)S[i]=1ll*A[i]*ksm(lim,p-)%p;
  60. }
  61.  
  62. }
  63. void main(int k){
  64. init(k);
  65. NTT(a,);NTT(b,);
  66. for(rt i=;i<lim;i++)a[i]=1ll*a[i]*b[i]%p;
  67. NTT(a,-);
  68. }
  69. }NTT;
  70. int main(){
  71. n=read()-;k=read();
  72. inv[]=inv[]=;
  73. for(rt i=;i<=k+;i++)inv[i]=1ll*inv[p%i]*(p-p/i)%p;
  74.  
  75. NTT.main(k);
  76. ll jc=,C=,ans=,sum=ksm(,n-j);
  77. for(rt j=;j<=k;j++){
  78. (ans+=S[j]*jc%p*C%p*sum)%=p;
  79. jc=jc*(j+)%p;C=C*(n-j)%p*inv[j+]%p;
  80. sum=sum*inv[]%p;
  81. }
  82. cout<<(ans*(n+)%p*ksm(,(ll)n*(n-)/)%p+p)%p;
  83. return ;
  84. }

BZOJ 5093: [Lydsy1711月赛]图的价值的更多相关文章

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

    [Lydsy1711月赛]图的价值 Time Limit: 30 Sec  Memory Limit: 256 MBSubmit: 245  Solved: 128[Submit][Status][D ...

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

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

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

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

  4. BZOJ 5093[Lydsy1711月赛]图的价值 线性做法

    博主曾更过一篇复杂度为$O( k· \log k)$的多项式做法在这里 惊闻本题有$ O(k)$的神仙做法,说起神仙我就想起了于是就去学习了一波 幂与第二类斯特林数 推导看这里 $$ x^k=\sum ...

  5. BZOJ.5093.[Lydsy1711月赛]图的价值(NTT 斯特林数)

    题目链接 对于单独一个点,我们枚举它的度数(有多少条边)来计算它的贡献:\[\sum_{i=0}^{n-1}i^kC_{n-1}^i2^{\frac{(n-2)(n-1)}{2}}\] 每个点是一样的 ...

  6. 【bzoj5093】 [Lydsy1711月赛]图的价值 组合数+斯特林数+NTT

    Description "简单无向图"是指无重边.无自环的无向图(不一定连通). 一个带标号的图的价值定义为每个点度数的k次方的和. 给定n和k,请计算所有n个点的带标号的简单无向 ...

  7. 【bzoj5093】[Lydsy1711月赛]图的价值(NTT+第二类斯特林数)

    题意: 给定\(n\)个点,一个图的价值定义为所有点的度数的\(k\)次方之和. 现在计算所有\(n\)个点的简单无向图的价值之和. 思路: 将式子列出来: \[ \sum_{i=1}^n\sum_{ ...

  8. bzoj5093:[Lydsy1711月赛]图的价值

    题目 首先考虑到这是一张有标号的图,每一个点的地位是相等的,因此我们只需要求出一个点的价值和乘上\(n\)就好了 考虑一个点有多少种情况下度数为\(i\) 显然我们可以让除了这个点的剩下的\(n-1\ ...

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

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

随机推荐

  1. JavaScript 函数闭包的应用

    一.模仿块级作用域 JavaScript 没有块级作用域的概念,那么可以模拟像java中将很多变量私有化封装起来,保护数据,防止数据泄漏,封装细节,这样安全性和可控性更高 function box(c ...

  2. Python距离放弃拉近的day03

    新的一天,依旧是内容补充,补充了数学没有的运算符,in和not in,就是判断in前面的东西是不是在后面的数据中,然后新课讲了平常最常用的字符串的方法,引号的里面全部都是字符串,在其中就会又如何判断这 ...

  3. [LeetCode] 3. 无重复字符的最长子串

    题目链接:(https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/) 题目描述: 给定一个字符 ...

  4. Django学习笔记之表单验证

    表单概述 HTML中的表单 单纯从前端的html来说,表单是用来提交数据给服务器的,不管后台的服务器用的是Django还是PHP语言还是其他语言.只要把input标签放在form标签中,然后再添加一个 ...

  5. Vue-异步组件

    一般情况下,在代码开头引入组件: import Vue from 'vue' import Router from 'vue-router' import Home from '@/pages/hom ...

  6. SpringCloud(9)使用Spring Cloud OAuth2保护微服务系统

    一.简介 OAth2是一个标准的授权协议. 在认证与授权的过程中,主要包含以下3种角色. 服务提供方 Authorization Server. 资源持有者 Resource Server. 客户端 ...

  7. すぬけ君の塗り絵 / Snuke's Coloring AtCoder - 2068 (思维,排序,贡献)

    Problem Statement We have a grid with H rows and W columns. At first, all cells were painted white. ...

  8. 【转】IT行业岗位以及发展方向

    以下转自https://blog.csdn.net/qq_23994787/article/details/79847270 职业生涯规划的意义 1.以既有的成就为基础,确立人生的方向,提供奋斗的策略 ...

  9. [转帖]Windows 10 部分早期版本已完全停止技术支持服务

    Windows 10 部分早期版本已完全停止技术支持服务 2019-4-12 01:27| 发布者: cjy__05| 查看: 10186| 评论: 47|来自: pcbeta 收藏分享 转帖来源:h ...

  10. EntityManagerFactory 是多线程的 将其变成一个单线程(使用静态方法)提交效率

    由于EntityManagerFactory 是一个线程安全的对象(即多个线程访问同一个EntityManagerFactory 对象不会有线程安全问题),并且EntityManagerFactory ...