BZOJ 5093: [Lydsy1711月赛]图的价值
第二类斯特林数模版题
需要一些组合数的小$ 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$
#include<ctime>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#define p 998244353
#define file(x)freopen(x".in","r",stdin);freopen(x".out","w",stdout)
#define rt register int
#define ll long long
using namespace std;
inline ll read(){
ll x = ; char zf = ; char ch = getchar();
while (ch != '-' && !isdigit(ch)) ch = getchar();
if (ch == '-') zf = -, ch = getchar();
while (isdigit(ch)) x = x * + ch - '', ch = getchar(); return x * zf;
}
void write(ll y){if(y<)putchar('-'),y=-y;if(y>)write(y/);putchar(y%+);}
void writeln(const ll y){write(y);putchar('\n');}
int i,j,k,m,n,x,y,z,cnt;
int a[],b[],R[],lim;
ll ksm(ll x,ll y){
if(!y)return ;ll ew=;
while(y>){
if(y&)y--,ew=x*ew%p;
y>>=,x=x*x%p;
}return x*ew%p;
}
int inv[],S[];
struct poly{
int n,m,lim;
void init(int k){
//a[i]=(-1)^i / i! b[i] = i^k/i!
n=k;
a[]=;b[]=;
for(rt i=;i<=k;i++){
a[i]=-1ll*a[i-]*inv[i]%p;
b[i]=ksm(i,k)*a[i]%p;
if(i&)b[i]=-b[i];
}
lim=;while(lim<=n+n)lim<<=;
for(rt i=;i<lim;i++)R[i]=(R[i>>]>>)|(i&?(lim>>):);
}
void NTT(int *A,int fla){
for(rt i=;i<lim;i++)if(i<R[i])swap(A[i],A[R[i]]);
for(rt i=;i<lim;i<<=){
ll w=ksm(,p//i);
for(rt j=;j<lim;j+=i<<){
ll K=;
for(rt k=;k<i;k++,K=K*w%p){
ll x=A[j+k],y=K*A[i+j+k];
A[j+k]=(x+y)%p;A[i+j+k]=(x-y)%p;
}
}
}
if(fla==-){
reverse(A+,A+lim);
for(rt i=;i<=n;i++)S[i]=1ll*A[i]*ksm(lim,p-)%p;
} }
void main(int k){
init(k);
NTT(a,);NTT(b,);
for(rt i=;i<lim;i++)a[i]=1ll*a[i]*b[i]%p;
NTT(a,-);
}
}NTT;
int main(){
n=read()-;k=read();
inv[]=inv[]=;
for(rt i=;i<=k+;i++)inv[i]=1ll*inv[p%i]*(p-p/i)%p; NTT.main(k);
ll jc=,C=,ans=,sum=ksm(,n-j);
for(rt j=;j<=k;j++){
(ans+=S[j]*jc%p*C%p*sum)%=p;
jc=jc*(j+)%p;C=C*(n-j)%p*inv[j+]%p;
sum=sum*inv[]%p;
}
cout<<(ans*(n+)%p*ksm(,(ll)n*(n-)/)%p+p)%p;
return ;
}
BZOJ 5093: [Lydsy1711月赛]图的价值的更多相关文章
- bzoj 5093 [Lydsy1711月赛]图的价值 NTT+第二类斯特林数
[Lydsy1711月赛]图的价值 Time Limit: 30 Sec Memory Limit: 256 MBSubmit: 245 Solved: 128[Submit][Status][D ...
- BZOJ 5093: [Lydsy1711月赛]图的价值 第二类斯特林数+NTT
定义有向图的价值为图中每一个点的度数的 \(k\) 次方之和. 求:对于 \(n\) 个点的无向图所有可能情况的图的价值之和. 遇到这种题,八成是每个点单独算贡献,然后累加起来. 我们可以枚举一个点的 ...
- bzoj 5093 [Lydsy1711月赛]图的价值——第二类斯特林数
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=5093 不要见到组合数就拆! 枚举每个点的度数,则答案为 \( n*\sum\limits_{ ...
- BZOJ 5093[Lydsy1711月赛]图的价值 线性做法
博主曾更过一篇复杂度为$O( k· \log k)$的多项式做法在这里 惊闻本题有$ O(k)$的神仙做法,说起神仙我就想起了于是就去学习了一波 幂与第二类斯特林数 推导看这里 $$ x^k=\sum ...
- BZOJ.5093.[Lydsy1711月赛]图的价值(NTT 斯特林数)
题目链接 对于单独一个点,我们枚举它的度数(有多少条边)来计算它的贡献:\[\sum_{i=0}^{n-1}i^kC_{n-1}^i2^{\frac{(n-2)(n-1)}{2}}\] 每个点是一样的 ...
- 【bzoj5093】 [Lydsy1711月赛]图的价值 组合数+斯特林数+NTT
Description "简单无向图"是指无重边.无自环的无向图(不一定连通). 一个带标号的图的价值定义为每个点度数的k次方的和. 给定n和k,请计算所有n个点的带标号的简单无向 ...
- 【bzoj5093】[Lydsy1711月赛]图的价值(NTT+第二类斯特林数)
题意: 给定\(n\)个点,一个图的价值定义为所有点的度数的\(k\)次方之和. 现在计算所有\(n\)个点的简单无向图的价值之和. 思路: 将式子列出来: \[ \sum_{i=1}^n\sum_{ ...
- bzoj5093:[Lydsy1711月赛]图的价值
题目 首先考虑到这是一张有标号的图,每一个点的地位是相等的,因此我们只需要求出一个点的价值和乘上\(n\)就好了 考虑一个点有多少种情况下度数为\(i\) 显然我们可以让除了这个点的剩下的\(n-1\ ...
- BZOJ5093 [Lydsy1711月赛]图的价值 【第二类斯特林数 + NTT】
题目链接 BZOJ5093 题解 点之间是没有区别的,所以我们可以计算出一个点的所有贡献,然后乘上\(n\) 一个点可能向剩余的\(n - 1\)个点连边,那么就有 \[ans = 2^{{n - 1 ...
随机推荐
- wangEditor的使用
wangEditor的使用 第一步,将其下载,并引入项目中. 第二步,引入js <script type="text/javascript" src="/plugi ...
- Luogu4755 Beautiful Pair 最值分治、主席树
传送门 整天做一些模板题感觉药丸 设\(val_i\)表示第\(i\)个位置的值 看到区间最大值考虑最值分治.对于当前的区间\([l,r]\),找到区间最大值\(mid\),递归\([l,mid-1] ...
- left join inner join 区别
left 以左表为准,左表在右表没有对应的记录,也为显示(右表字段填空). inner 需要满足两张表都有记录. 不管哪种join 一对多最终的结局 只会是多条记录
- 二分查找c++实现
二分查找的算法原理较为简单,在此给出c++代码实现,以及代码中遇到的问题,以及解决方案: # include "iostream" using namespace std; //t ...
- php面向对象之构造函数作用与方法
什么是构造函数呢?构造函数又有什么作用呢? 构造函数 ,是一种特殊的方法.主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中.特别的一个类可以有多个 ...
- DAY16、模块和包
一.模块 1.模块的加载顺序:内存 =>内置 =>sys.path(一系列自定义模块) 2.sys.path:环境变量,存放文件路径的列表 重点:默认列表第一个元素就是当前被执行文件所在的 ...
- Visual Studio Code常用设置及快捷键
1. Visual Studio Code常用设置 { // 控制是否显示 minimap(缩略图) "editor.minimap.enabled": false, // 控制折 ...
- Flask的插件session、SQLAlchemy、Script、Migrate
一.flask-session 1.为什么要使用flask-session 因为flask默认的session是通过请求上下文放入到Local中的,是存在内存的,而使用flask-session可以更 ...
- 数据分析---《Python for Data Analysis》学习笔记【04】
<Python for Data Analysis>一书由Wes Mckinney所著,中文译名是<利用Python进行数据分析>.这里记录一下学习过程,其中有些方法和书中不同 ...
- Django 分页组件替换自定义分页
Django的分页器(paginator) 总之不太好用我们还是用自己的好一些 自定义分页器 分页实现源码 """ 自定义分页组件 """ ...