题目: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. notepad++使用正则表达式的查找替换

    使用正则表达式可以很好地完成很多繁琐耗时的工作,以下抄录editplus正则表达式的使用,同样适用于notepad++:表达式 说明\t 制表符.\n 新行.. 匹配任意字符.| 匹配表达式左边和右边 ...

  2. 重装window 7系统,从做一个u盘启动盘,到装系统,很不错

    老毛桃U盘启动盘制作工具是现在最流行的U盘装系统和维护电脑的专用工具,一是制作简单,几乎100%支持所有U盘一键制作为启动盘,不必顾虑以前量产U盘考虑专用工具的问题.二是制作后工具功能强大,支持GHO ...

  3. oracle between、 all、 in 和 exists的区别,模糊查询、4个正则表达式

    --条件比较 /* =,!=,<>,<,>,<=,>=, any,some,all is null,is not null between x and y in(l ...

  4. CodeChef FORESTGA 二分

    Forest Gathering   Problem code: FORESTGA Tweet     ALL SUBMISSIONS All submissions for this problem ...

  5. 关于log4j.properties例子:DailyRollingFileAppender

    package com.v512.log4j; import org.apache.log4j.Logger; public class HelloLog4J { // 构造记录器,形参是记录器所在的 ...

  6. Pandas分组(GroupBy)

    任何分组(groupby)操作都涉及原始对象的以下操作之一.它们是 - 分割对象 应用一个函数 结合的结果 在许多情况下,我们将数据分成多个集合,并在每个子集上应用一些函数.在应用函数中,可以执行以下 ...

  7. define用于条件编译

    格式: #ifndef _test.h_ //这里放不想被重复包含的代码 #define _test.h_ #endif define用于条件编译的意思是不想让头文件重复编译,头文件重复编译会造成的结 ...

  8. tensorflow笔记:使用tf来实现word2vec

    (一) tensorflow笔记:流程,概念和简单代码注释 (二) tensorflow笔记:多层CNN代码分析 (三) tensorflow笔记:多层LSTM代码分析 (四) tensorflow笔 ...

  9. 使用ssm整合是创建Maven项目报错Failure to transfer com.thoughtworks.xstream:xstream:pom:1.3.1

    Description Resource Path Location TypeFailure to transfer com.thoughtworks.xstream:xstream:pom:1.3. ...

  10. javascript异步编程的几种方法

    目前工作中用的比较多的异步模式编程有如下几种方法 一 回调函数 这是异步编程最基本的方法,假设有两个函数f1和f2,后者等待前者的执行结果 f1(); f2(); 如果f1是一个很耗时的任务,可以考虑 ...