BZOJ 5093: [Lydsy1711月赛]图的价值 第二类斯特林数+NTT
定义有向图的价值为图中每一个点的度数的 \(k\) 次方之和.
求:对于 \(n\) 个点的无向图所有可能情况的图的价值之和.
遇到这种题,八成是每个点单独算贡献,然后累加起来.
我们可以枚举一个点的度数是多少,然后试着去算该情况下的贡献,即 \(\sum_{i=0}^{n-1}\binom{n-1}{i}i^k\)
由于一共有 \(n\) 个点,而除了我们限定的边之外其余的边都是可以随便连的.
故 \(Ans=n\times 2^{\frac{(n-1)(n-2)}{2}}\times \sum_{i=0}^{n-1}\binom{n-1}{i}i^k\)
前面的好算,关键在于后面的 \(\sum_{i=0}^{n-1}\binom{n-1}{i}i^k\)
考虑将 \(i^k\) 按照第二类斯特林数的方式展开,得 \(\sum_{i=0}^{n-1}\sum_{j=0}^{i}S(k,j)\binom{i}{j}(j!)\)
考虑提前枚举 \(j\),有 \(\sum_{j=0}^{n-1}S(k,j)(j!)\sum_{i=j}^{n-1}\binom{n-1}{i}\binom{i}{j}\)
后面那个 \(\sum_{i=j}^{n-1}\binom{n-1}{i}\binom{i}{j}\) 还可以继续推,将组合数变换一下,有 \(\sum_{i=j}^{n-1}\binom{n-1}{j}\binom{n-1-j}{i-j}\)
\(\Rightarrow \binom{n-1}{j}\sum_{i=j}^{n-1}\binom{n-1-j}{i-j}\)
然后 \(\sum_{i=j}^{n-1}\binom{n-1-j}{i-j}\) 的组合意义是从 \(n-1-j\) 个元素中选择有标号的 \(0,1,2...n-1-j\) 个元素的方案数.
这个直接就可以写成 \(2^{n-1-j}\)
故 \(Ans=n\times 2^{\frac{(n-1)(n-2)}{2}}\sum_{j=0}^{n-1}S(k,j)(j!)\binom{n-1}{j}2^{n-1-j}\)
由于 \(j\leqslant k\) 时斯特林数才有意义,所以我们只需枚举到 \(min(k,n-1)\) 即可.
斯特林数要用 NTT 来预处理.
#include <bits/stdc++.h>
#define LL long long
#define setIO(s) freopen(s".in","r",stdin)
using namespace std;
const int G=3,mod=998244353,N=400005,phi=998244352;
inline int qpow(int x,int y)
{
int tmp=1;
for(;y;y>>=1,x=1ll*x*x%mod) if(y&1) tmp=1ll*tmp*x%mod;
return tmp;
}
inline int INV(int x) { return qpow(x,mod-2); }
inline void NTT(int *a,int len,int flag)
{
int i,j,k,mid;
for(i=k=0;i<len;++i)
{
if(i>k) swap(a[i],a[k]);
for(j=len>>1;(k^=j)<j;j>>=1);
}
for(mid=1;mid<len;mid<<=1)
{
int wn=qpow(G,(mod-1)/(mid<<1));
if(flag==-1) wn=INV(wn);
for(i=0;i<len;i+=mid<<1)
{
int w=1;
for(j=0;j<mid;++j)
{
int x=a[i+j],y=1ll*w*a[i+j+mid]%mod;
a[i+j]=1ll*(x+y)%mod, a[i+j+mid]=1ll*(x-y+mod)%mod;
w=1ll*w*wn%mod;
}
}
}
if(flag==-1)
{
int rev=INV(len);
for(i=0;i<len;++i) a[i]=1ll*a[i]*rev%mod;
}
}
int f[N<<2],g[N<<2],fac[N],inv[N];
void Initialize(int Lim)
{
int i,j,limit;
inv[0]=fac[0]=1;
for(i=1;i<=Lim;++i) fac[i]=1ll*fac[i-1]*i%mod,inv[i]=INV(fac[i]);
for(i=0;i<=Lim;++i)
{
f[i]=inv[i];
if(i&1) f[i]=mod-f[i];
g[i]=1ll*inv[i]*qpow(i,Lim)%mod;
}
for(limit=1;limit<=2*(Lim+1);limit<<=1);
NTT(f,limit,1),NTT(g,limit,1);
for(i=0;i<limit;++i) f[i]=1ll*f[i]*g[i]%mod;
NTT(f,limit,-1);
}
int main()
{
// setIO("input");
int i,j,n,k,ans=0,Lim;
scanf("%d%d",&n,&k),Lim=min(n-1,k);
Initialize(k);
int now=1,tot=n-1;
for(i=0;i<=Lim;++i)
{
int delta=1ll*f[i]*now%mod*qpow(2,n-1-i)%mod;
ans=(ans+delta)%mod;
now=1ll*now*tot%mod;
--tot;
}
ans=1ll*ans*n%mod;
ans=1ll*ans*qpow(2,1ll*(n-1)*(n-2)/2%phi)%mod;
printf("%d\n",ans);
return 0;
}
BZOJ 5093: [Lydsy1711月赛]图的价值 第二类斯特林数+NTT的更多相关文章
- bzoj 5093 [Lydsy1711月赛]图的价值——第二类斯特林数
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=5093 不要见到组合数就拆! 枚举每个点的度数,则答案为 \( n*\sum\limits_{ ...
- bzoj 5093 图的价值 —— 第二类斯特林数+NTT
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=5093 每个点都是等价的,从点的贡献来看,得到式子: \( ans = n * \sum\li ...
- bzoj 5093 [Lydsy1711月赛]图的价值 NTT+第二类斯特林数
[Lydsy1711月赛]图的价值 Time Limit: 30 Sec Memory Limit: 256 MBSubmit: 245 Solved: 128[Submit][Status][D ...
- BZOJ 5093: [Lydsy1711月赛]图的价值
第二类斯特林数模版题 需要一些组合数的小$ trick$ upd:这里更新了本题巧妙的$ O(k)$做法,虽然常数很大就是了 传送门:here 题意:求所有$ n$个节点的无重边自环图的价值和,定义一 ...
- 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}}\] 每个点是一样的 ...
- 【XSY1301】原题的价值 第二类斯特林数 NTT
题目描述 给你\(n,m\),求所有\(n\)个点的简单无向图中每个点度数的\(m\)次方的和. \(n\leq {10}^9,m\leq {10}^5\) 题解 \(g_n\)为\(n\)个点的无向 ...
- BZOJ5093 [Lydsy1711月赛]图的价值 【第二类斯特林数 + NTT】
题目链接 BZOJ5093 题解 点之间是没有区别的,所以我们可以计算出一个点的所有贡献,然后乘上\(n\) 一个点可能向剩余的\(n - 1\)个点连边,那么就有 \[ans = 2^{{n - 1 ...
- bzoj5093:图的价值(第二类斯特林数+NTT)
传送门 首先,题目所求为\[n\times 2^{C_{n-1}^2}\sum_{i=0}^{n-1}C_{n-1}^ii^k\] 即对于每个点\(i\),枚举它的度数,然后计算方案.因为有\(n\) ...
随机推荐
- es6新特性-解构表达式、Lambda表达式、局部变量及map/reduce方法
循环内的变量在循环外可见,不合理: let定义的变量是局部变量: const修饰的是常量,不允许再次修改,类似于java中的static: 解构表达式:
- (转)AS3正则:元子符,元序列,标志,数量表达符
(转)AS3正则:元子符,元序列,标志,数量表达符: AS3正则:元子符,元序列,标志,数量表达符 七月 4th, 2010 归类于 AS3前端技术 作者Linkjun 进行评论 as3正则:元子符, ...
- Codeforces 1239B. The World Is Just a Programming Task (Hard Version)
传送门 这一题好妙啊 首先把括号序列转化成平面直角坐标系 $xOy$ 上的折线,初始时折线从坐标系原点 $(0,0)$ 出发 如果第 $i$ 个位置是 '(' 那么折线就往上走一步($y+1$),否则 ...
- python线程(转)
转自:https://www.cnblogs.com/huxi/archive/2010/06/26/1765808.html
- JAVA MyBybatis分页
java: import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; impo ...
- Linux 用户管理命令笔记
1.新增用户 useradd user1 用户创建流程 1.系统先将用户信息记录在/etc/passwd中,一般会在/etc/passwd和/etc/shadow末尾,同时分配该用户UID. 2.创建 ...
- python3基础之“函数(1)”
1.type:查看当前字符串的类型 c=' print(type(c),c) b= int(c) print(type(b),b) num=" a=int(num,base=16) prin ...
- git 出现 fatal: remote origin already exists 错误
当输入$ git remote add origin git@github.com:djqiang(github帐号名)/gitdemo(项目名).git 出现 如下错误: 解决办法如下: 1.先输入 ...
- org.apache.commons.beanutils.ConversionException: No value specified解决办法
转自:https://www.cnblogs.com/linjiqin/archive/2011/07/21/2112628.html 当用到了java.sql.Date时间等非内置对象时,如果对象为 ...
- centos 7.6 安装php70
1.首先查看是否有老版本 yum list installed | grep php 2.如果安装的有,清除老版本 yum remove php.x86_64 php-cli.x86_64 php-c ...