题目:https://www.lydsy.com/JudgeOnline/problem.php?id=5093

不要见到组合数就拆!

枚举每个点的度数,则答案为  \( n*\sum\limits_{i=0}^{n-1}C_{n-1}^{i}*2^{C_{n-1}^{2}}*i^{k} \)

(又是那个公式:\( x^{n}=\sum\limits_{k=0}^{n}C_{x}^{k}*(k!)*S(n,k) \))

               \( = n*2^{C_{n-1}^{2}}\sum\limits_{i=0}^{n-1}C_{n-1}^{i}\sum\limits_{j=0}^{k}C_{i}^{j}*(j!)*S(k,j) \)

这里发现组合数的角标有一样的,不要把那两个组合数拆了以消掉阶乘,而可以通过组合意义把它们合起来!

               \( = n*2^{C_{n-1}^{2}}\sum\limits_{j=0}^{k}(j!)*S(k,j)\sum\limits_{i=0}^{n-1}C_{n-1}^{i}*C_{i}^{j} \)

从 n-1 个数里选 i 个数,再从 i 个数里选 j 个数,而且 i 从 0 枚举到 n-1 ,就可以看作从 n-1 个数里选了 j 个数,剩下  n-1-j  个数可选可不选。

  (比如一个点 1 想连到另一个点 2 , 1 先在 n-1 个点里选 i 个点连上,再从这 i 个点里选 j 个点连到点 2 ; 也即点 1 在 n-1 个点里选了 j 个点连向点 2 ,其余的点可能和点 1 相连)

所以             \( = n*2^{C_{n-1}^{2}}\sum\limits_{j=0}^{k}(j!)*S(k,j)*C_{n-1}^{j}*2^{n-1-j} \)

用 NTT 预处理斯特林数就行了。别把现在的组合数拆掉,因为是一维特别大,一维特别小,所以分子和分母消一下。需要预处理阶乘和下降幂,才能做到 O(1) 算组合数。

注意指数上模 mod-1 。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const int N=2e5+5,M=(1<<19)+5,mod=998244353;
int n,m,s[N],a[M],b[M],jcn[N],ljc[N],len,r[M];
void upd(int &x){x>=mod?x-=mod:0;}
int pw(int x,int k)
{int ret=1;while(k){if(k&1)ret=(ll)ret*x%mod;x=(ll)x*x%mod;k>>=1;}return ret;}
void ntt(int *a,bool fx)
{for(int i=0;i<len;i++)if(i<r[i])swap(a[i],a[r[i]]);for(int R=2;R<=len;R<<=1){int wn=pw( 3,fx?(mod-1)-(mod-1)/R:(mod-1)/R );for(int i=0,m=R>>1;i<len;i+=R)for(int j=0,w=1;j<m;j++,w=(ll)w*wn%mod){int x=a[i+j], y=(ll)w*a[i+m+j]%mod;a[i+j]=x+y;  upd(a[i+j]);a[i+m+j]=x+mod-y;  upd(a[i+m+j]);}}if(!fx)return ; int inv=pw(len,mod-2);for(int i=0;i<len;i++)a[i]=(ll)a[i]*inv%mod;
}
void init()
{jcn[0]=1;for(int i=1;i<=m;i++)jcn[i]=(ll)jcn[i-1]*i%mod;jcn[m]=pw(jcn[m],mod-2);for(int i=m-1;i>=0;i--)jcn[i]=(ll)jcn[i+1]*(i+1)%mod;for(int i=0,j=1;i<=m;i++,j=-j)a[i]=j*jcn[i]+mod,upd(a[i]);for(int i=0;i<=m;i++)b[i]=(ll)pw(i,m)*jcn[i]%mod;for(len=1;len<=m<<1;len<<=1);for(int i=0;i<len;i++)r[i]=(r[i>>1]>>1)+((i&1)?len>>1:0);ntt(a,0); ntt(b,0);for(int i=0;i<len;i++)a[i]=(ll)a[i]*b[i]%mod;ntt(a,1);for(int i=0;i<=m;i++)s[i]=a[i];ljc[0]=1;for(int i=n-1,j=1;j<=m;j++,i--)ljc[j]=(ll)ljc[j-1]*i%mod;
}
int C(int m)
{return (ll)ljc[m]*jcn[m]%mod;
}
int main()
{scanf("%d%d",&n,&m);init();int ans=0;for(int i=0,jc=1;i<=m;i++,jc=(ll)jc*i%mod){if(i>n-1)break;//or pw()ans=(ans+(ll)jc*C(i)%mod*pw(2,n-1-i)%mod*s[i])%mod;}ans=(ll)ans*n%mod*pw(2,(ll)(n-1)*(n-2)/2%(mod-1))%mod;//mod-1printf("%d\n",ans);return 0;
}

转载于:https://www.cnblogs.com/Narh/p/10070114.html

bzoj 5093 [Lydsy1711月赛]图的价值——第二类斯特林数相关推荐

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

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

  2. BZOJ 4555 Luogu P4091 [HEOI2016/TJOI2016]求和 (第二类斯特林数)

    题目链接 (lugou) https://www.luogu.org/problem/P4091 (bzoj) https://www.lydsy.com/JudgeOnline/problem.ph ...

  3. 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 ...

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

    bzoj5093: [Lydsy1711月赛]图的价值 题目描述 Solution 考虑每一个点的贡献,枚举它的度数. Ans=n∗2(n−12)∑i=1n−1(n−1i)∗ikAns=n*2^{\t ...

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

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

  6. BZOJ 2159 「国家集训队」Crash 的文明世界(第二类斯特林数,换根DP)【BZOJ计划】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://hydro.ac/d/bzoj/p/2159 是 hydro 的 BZOJ ...

  7. 【BZOJ 4555】[Tjoi2016Heoi2016]求和 多项式求逆/NTT+第二类斯特林数

    出处0.0 用到第二类斯特林数的性质,做法好像很多,我打的是直接ntt,由第二类斯特林数的容斥公式可以推出,我们可以对于每一个i,来一次ntt求出他与所有j组成的第二类斯特林数的值,这个时候我们是O( ...

  8. BZOJ5093 图的价值(NTT+斯特林数)

    显然每个点会提供相同的贡献.于是现在只考虑1号点的贡献.若其度数为i,则在2~n号点选i个连上,剩下的边随便连,这样可以算出答案为 这个式子可以O(n)计算.发现k比较小,于是考虑如何将这个式子化为与 ...

  9. 【组合数学】第一类,第二类斯特林数(Stirling),Bell数

    第一类斯特林数 定理: 第一类斯特林数S1(p,k)计数的是把p个对象排成k个非空循环排列的方法数. 证明:把上述定理叙述中的循环排列叫做圆圈 递推公式: S1(p,p)=1(p>=0),有p个 ...

最新文章

  1. PHP 基础知识-数组
  2. warning delete ·· (prettier/prettier)
  3. dapperpoco mysql_.NET(C#)有哪些主流的ORM框架,SqlSugar,Dapper,EF还是...
  4. html常用标签6-表单标签
  5. python-flask-Flask-SQLAlchemy与Flask-Migrate联合进行数据化迁移
  6. SpringBoot启动时实现自动执行代码的几种方式讲解
  7. php 多态实现案例
  8. 《长城保护总体规划》出台 为长城保护提供遵循依据
  9. 胖哈勃杯Pwn400、Pwn500详解
  10. 双态运维联盟(BOA)正式成立
  11. 前端面试被问到项目中的难点有哪些?
  12. 【算法】动态规划之计算二项式系数(C++源码)
  13. RealView MDK
  14. 计算机毕业设计Java中文网络小说平台系统(源码+系统+mysql数据库+lw文档)
  15. 转:pdf密码破解专题
  16. Source Insight 不显示文件列表
  17. 快递物流查询,物流多次派件的单号怎样筛选
  18. l4d2显示所有服务器的指令,求生之路2指令大全 求生之路2指令怎么用? 地图指令-游侠网...
  19. pve 导入 ova
  20. oracle 自带性能监控,oracle的性能监控

热门文章

  1. arcgis 批量计算几何_ArcGIS数据统计
  2. sql查询每科成绩的最高分_数据分析SQL查询:一文带你入门到掌握
  3. 是什么原因让你选择做程序员
  4. 计算出linux cache,关于计算buffer cache hit rate的精确算法
  5. linux多级反馈队列的实现,多级反馈队列调度算法的实现
  6. java的jtextarea_java中怎么在JTextArea中添加图片?
  7. oracle内存参数越大越好吗,什么是Oracle内存参数调优技术?
  8. 请求参数 统一 管理 java_Retrofit+Rxjava+okhttp基本操作和统一处理 – R...
  9. python正则替换查询_使用Python中的正则表达式进行搜索和替换
  10. linux规定ip使用网卡,使用TC 对LINUX服务器网卡进行带宽限制的办法