显然每个点会提供相同的贡献。于是现在只考虑1号点的贡献。若其度数为i,则在2~n号点选i个连上,剩下的边随便连,这样可以算出答案为

这个式子可以O(n)计算。发现k比较小,于是考虑如何将这个式子化为与k有关的求和。

显然前面一部分可以直接提走。考虑后面一部分的组合意义:n-1个有标号盒子里面选i个,放进去k个球的方案数

可以对这个过程进行变换:把k个球放在n-1个有标号盒子里,有球的盒子必须选,没有的可选可不选的方案数

枚举有球的盒子有多少个,可以发现答案变成了一个与k有关的式子:

S(k,i)为第二类斯特林数,也即将k个小球放进i个盒子(每个盒子非空)的方案数。

问题变为快速求斯特林数。可以用容斥原理推导出斯特林数卷积形式的通项公式:

即给盒子标上号,枚举有几个空盒。再化一下:

这样卷积形式就很明显了。用NTT算一下即可。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
int read()
{int x=0,f=1;char c=getchar();while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();return x*f;
}
#define P 998244353
#define N 300000
int n,k,a[N],v[N<<1],s[N<<1],inv[N],ans,ans2;
int t,r[N<<1];
int ksm(int a,int k)
{if (k==0) return 1;int tmp=ksm(a,k>>1);if (k&1) return 1ll*tmp*tmp%P*a%P;else return 1ll*tmp*tmp%P;
}
void inc(int &x,int y){x+=y;if (x>=P) x-=P;}
void DFT(int n,int *a,int p)
{for (int i=0;i<n;i++) if (i<r[i]) swap(a[i],a[r[i]]);for (int i=2;i<=n;i<<=1){int wn=ksm(p,(P-1)/i);for (int j=0;j<n;j+=i){int w=1;for (int k=j;k<j+(i>>1);k++,w=1ll*w*wn%P){int x=a[k],y=1ll*w*a[k+(i>>1)]%P;a[k]=(x+y)%P;a[k+(i>>1)]=(x-y+P)%P;}}}
}
int main()
{freopen("bzoj5093.in","r",stdin);freopen("bzoj5093.out","w",stdout);n=read(),k=read();ans=1ll*n*ksm(2,1ll*(n-1)*(n-2)/2%(P-1))%P;n--;inv[1]=1;for (int i=2;i<=max(3,min(n,k));i++) inv[i]=(P-1ll*(P/i)*inv[P%i]%P)%P;a[0]=ksm(2,n);for (int i=1;i<=min(n,k);i++)a[i]=1ll*a[i-1]*inv[2]%P*(n-i+1)%P;v[0]=1;for (int i=1;i<=min(n,k);i++)v[i]=(P-1ll*v[i-1]*inv[i]%P)%P;s[0]=0;int facinv=1;for (int i=1;i<=min(n,k);i++){facinv=1ll*facinv*inv[i]%P;s[i]=1ll*ksm(i,k)*facinv%P; }t=1;while (t<=(min(n,k)<<1)) t<<=1;for (int i=0;i<t;i++) r[i]=(r[i>>1]>>1)|(i&1)*(t>>1);DFT(t,s,3),DFT(t,v,3);for (int i=0;i<t;i++) s[i]=1ll*s[i]*v[i]%P;DFT(t,s,inv[3]);int p=ksm(t,P-2);for (int i=0;i<t;i++) s[i]=1ll*s[i]*p%P;for (int i=0;i<=min(n,k);i++)inc(ans2,1ll*a[i]*s[i]%P);ans=1ll*ans*ans2%P;cout<<ans;fclose(stdin);fclose(stdout);return 0;
}

转载于:https://www.cnblogs.com/Gloid/p/9390082.html

BZOJ5093 图的价值(NTT+斯特林数)相关推荐

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

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

  2. 【题解】BZOJ5093图的价值(二项式+NTT)

    [题解]BZOJ5093图的价值(二项式+NTT) 今天才做这道题,是我太弱了 强烈吐槽c++这种垃圾语言tmd数组越界不re反倒去别的数组里搞事情我只想说QAQ 推了一张A4纸的式子 考虑每个点的度 ...

  3. bzoj5093 图的价值【第二类斯特林数+NTT】

    解题思路: 考虑直接枚举每个点连的边,图中其余点之间随便连,那么直接推式子: ans=n∗2C2n−1∑i=0n−1Cin−1ikans=n*2^{C_{n-1}^2}\sum\limits_{i=0 ...

  4. BZOJ5093图的价值(斯特林数)

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

  5. Bzoj5093: 图的价值

    题面 Bzoj Sol 一张无向无重边自环的图的边数最多为\(\frac{n(n-1)}{2}\) 考虑每个点的贡献 \[n*2^{\frac{n(n-1)}{2} - (n-1)}\sum_{i=0 ...

  6. BZOJ.4555.[HEOI2016TJOI2016]求和(NTT 斯特林数)

    题目链接 \(Description\) 求\[\sum_{i=0}^n\sum_{j=0}^iS(i,j)\times 2^j\times j!\mod 998244353\] 其中\(S(i,j) ...

  7. 《小学生都能看懂的三类斯特林数从入门到升天教程 》(含性质完整证明、斯特林反演、拉赫数)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 真的特别简单,我尽量讲的详细一些,本文包含了几乎所有性质定理证明,老少皆宜 ~ 内容过多,质量过硬,建 ...

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

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

  9. Team Work(CF 932 E)[bzoj5093][Lydsy1711月赛]图的价值

    0 前言 这是一道小清新题 1 题目相关 1.1传送门 传送门 1.2 题目大意 给出n,kn,kn,k,求∑i=0n(ni)ik\sum_{i=0}^n\binom{n}{i}i^ki=0∑n​(i ...

最新文章

  1. 一个妹子图应用客户端源码
  2. 微软Windows 7实现10秒启动的背后
  3. Swiper使用心得
  4. Ubuntu下实现eth0与wlan0完美桥接
  5. Linux之特殊权限
  6. 第四次作业-测试作业
  7. Mac原生浏览器Safari,那些你都不知道的使用技巧
  8. FindBugs-IDEA图标说明
  9. 计算机基础(2)——重装系统(2)——win10(1)——MediaCreationTool制作WIN10安装U盘,安装纯净版win10的通用教程
  10. NR - SIB1 PDCCH时域频域位置
  11. java邮箱exchange_Exchange服务器之java mail 使用:exchange邮箱
  12. 罗振宇解读《今日简史》:21个议题就是21个千亿美金的机会
  13. c++ 与 数据结构 实现 《校园路径导航系统》
  14. Qt编写安防视频监控系统(支持win/linux/mac/海康/大华/宇视/264/265等)
  15. 人鱼之伤的怪物原型=克苏鲁的deep one
  16. ORA-01005: null password given; logon denied
  17. 【机器学习|数学基础】Mathematics for Machine Learning系列之线性代数(26):线性变换的矩阵表达式
  18. Raiffeisen银行俄罗斯分行使用区块链发放数字抵押贷款
  19. 9.1 什么是包图?
  20. OpenCV图像二值化,Python

热门文章

  1. .netcore 判断是否 ajax 请求_第3部分-异步使用2-2:Ajax 之 状态码
  2. 大数据营销案例沃尔玛_实现大数据营销的方式有哪些
  3. 进程外session(session保存在sqlserver)
  4. serviceFabric oracle,Oracle ASM和多路径软件的兼容性【转】
  5. matplotlib 对称图_Python入门向:Matplotlib自救指南篇,从此做图不求人(一)
  6. 敏捷开发之组织级经验分享
  7. arduino的矩阵示例程序_用树莓派 Arduino 制造 LED 矩阵彩灯
  8. 计算机辅助设计技术案例,【智能科技学院】学院前沿技术运用课程组开展“计算机辅助设计”专题讲座...
  9. Hbase table DDL操作及scala API操作
  10. Kicad快捷键大全