题目: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+,M=(<<)+,mod=;
int n,m,s[N],a[M],b[M],jcn[N],ljc[N],len,r[M];
void upd(int &x){x>=mod?x-=mod:;}
int pw(int x,int k)
{int ret=;while(k){if(k&)ret=(ll)ret*x%mod;x=(ll)x*x%mod;k>>=;}return ret;}
void ntt(int *a,bool fx)
{
for(int i=;i<len;i++)
if(i<r[i])swap(a[i],a[r[i]]);
for(int R=;R<=len;R<<=)
{
int wn=pw( ,fx?(mod-)-(mod-)/R:(mod-)/R );
for(int i=,m=R>>;i<len;i+=R)
for(int j=,w=;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-);
for(int i=;i<len;i++)a[i]=(ll)a[i]*inv%mod;
}
void init()
{
jcn[]=;for(int i=;i<=m;i++)jcn[i]=(ll)jcn[i-]*i%mod;
jcn[m]=pw(jcn[m],mod-);for(int i=m-;i>=;i--)jcn[i]=(ll)jcn[i+]*(i+)%mod;
for(int i=,j=;i<=m;i++,j=-j)
a[i]=j*jcn[i]+mod,upd(a[i]);
for(int i=;i<=m;i++)
b[i]=(ll)pw(i,m)*jcn[i]%mod;
for(len=;len<=m<<;len<<=);
for(int i=;i<len;i++)r[i]=(r[i>>]>>)+((i&)?len>>:);
ntt(a,); ntt(b,);
for(int i=;i<len;i++)a[i]=(ll)a[i]*b[i]%mod;
ntt(a,);
for(int i=;i<=m;i++)s[i]=a[i]; ljc[]=;for(int i=n-,j=;j<=m;j++,i--)ljc[j]=(ll)ljc[j-]*i%mod;
}
int C(int m)
{
return (ll)ljc[m]*jcn[m]%mod;
}
int main()
{
scanf("%d%d",&n,&m);
init();
int ans=;
for(int i=,jc=;i<=m;i++,jc=(ll)jc*i%mod)
{
if(i>n-)break;//or pw()
ans=(ans+(ll)jc*C(i)%mod*pw(,n--i)%mod*s[i])%mod;
}
ans=(ll)ans*n%mod*pw(,(ll)(n-)*(n-)/%(mod-))%mod;//mod-1
printf("%d\n",ans);
return ;
}

bzoj 5093 [Lydsy1711月赛]图的价值——第二类斯特林数的更多相关文章

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

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

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

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

  3. BZOJ 5093: [Lydsy1711月赛]图的价值

    第二类斯特林数模版题 需要一些组合数的小$ trick$ upd:这里更新了本题巧妙的$ O(k)$做法,虽然常数很大就是了 传送门:here 题意:求所有$ n$个节点的无重边自环图的价值和,定义一 ...

  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. bzoj 5093 图的价值 —— 第二类斯特林数+NTT

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

  7. BZOJ 2159: Crash 的文明世界(组合数学+第二类斯特林数+树形dp)

    传送门 解题思路 比较有意思的一道数学题.首先\(n*k^2\)的做法比较好想,就是维护一个\(x^i\)这种东西,然后转移的时候用二项式定理拆开转移.然后有一个比较有意思的结论就是把求\(x^i\) ...

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

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

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

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

随机推荐

  1. Linux系统下修改IP地址、网关、DNS的基本方法

    临时修改IP地址.网关.主机名.DNS,马上生效,无需重启(重启后失效) 1.修改主机名 #hostname Slyar 2.修改IP地址(eth0为网卡名称) #ifconfig eth0 192. ...

  2. session的活化与钝化 (转)

    session的活化与钝化就是当用户访问时网站异常,不能丢掉session,所有也必须采用文件存储:和之前那个统计网站访问量一样的原理. class Person implements必须实现这两个接 ...

  3. Java JDBC概要总结一(基本操作和SQL注入问题)

    JDBC定义: JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API.JDBC是Java访问数据库的标准规范,可以为不同的关系 ...

  4. 正则表达式【TLCL】

    grep[global regular expression print] print lines matching a pattern grep [options] regex [file...] ...

  5. 前端开发日记之jQuery

    优先引入CDN上的jQuery,如果失效再引入本地的jQuery! <script src="http://libs.baidu.com/jquery/1.11.1/jquery.js ...

  6. JavaScript字符串转换为变量名

    1.将一个字符串转换为变量名 [javascript] view plain copy print? function string_to_name(string){ let _name = 'var ...

  7. U盘安装XP

    ZC: 第1阶段结束 进入第2阶段 的时候,还是需要手动选择USB启动 (如果没有修改BIOS为USB启动的话) ZC: 我用的 WinSetupFromUSB,是文章尾部的那个版本的软件界面. ZC ...

  8. Linux 设备驱动之 UIO 机制

    一个设备驱动的主要任务有两个: 1. 存取设备的内存 2. 处理设备产生的中断 对于第一个任务.UIO 核心实现了mmap()能够处理物理内存(physical memory),逻辑内存(logica ...

  9. js 小秘密

    1.RegExp 对象方法 test检索字符串中指定的值.返回 true 或 false. 支持正则表达式的 String 对象的方法

  10. Robot Framework(一)

    一. 定义 Robot Framework是一款python编写的功能自动化测试框架,具有良好的可扩展性,支持关键字驱动,可以同时测试多种类型的客户端或者接口,可以进行分布式测试执行 二. Robot ...