定义有向图的价值为图中每一个点的度数的 \(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的更多相关文章

  1. bzoj 5093 [Lydsy1711月赛]图的价值——第二类斯特林数

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=5093 不要见到组合数就拆! 枚举每个点的度数,则答案为 \( n*\sum\limits_{ ...

  2. bzoj 5093 图的价值 —— 第二类斯特林数+NTT

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

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

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

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

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

  5. BZOJ 5093[Lydsy1711月赛]图的价值 线性做法

    博主曾更过一篇复杂度为$O( k· \log k)$的多项式做法在这里 惊闻本题有$ O(k)$的神仙做法,说起神仙我就想起了于是就去学习了一波 幂与第二类斯特林数 推导看这里 $$ x^k=\sum ...

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

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

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

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

  8. BZOJ5093 [Lydsy1711月赛]图的价值 【第二类斯特林数 + NTT】

    题目链接 BZOJ5093 题解 点之间是没有区别的,所以我们可以计算出一个点的所有贡献,然后乘上\(n\) 一个点可能向剩余的\(n - 1\)个点连边,那么就有 \[ans = 2^{{n - 1 ...

  9. bzoj5093:图的价值(第二类斯特林数+NTT)

    传送门 首先,题目所求为\[n\times 2^{C_{n-1}^2}\sum_{i=0}^{n-1}C_{n-1}^ii^k\] 即对于每个点\(i\),枚举它的度数,然后计算方案.因为有\(n\) ...

随机推荐

  1. AS3数字取整

    AS3 数字取整方法int()去掉小数点trace(int(3.14)); //输出3trace(int(-3.14)); //输出-3Math.round()方法:Math.round()可以四舍五 ...

  2. python 操作redis集群

    一.连接redis集群 python的redis库是不支持集群操作的,推荐库:redis-py-cluster,一直在维护.还有一个rediscluster库,看GitHub上已经很久没更新了. 安装 ...

  3. MVC-08模型

    部分7:添加数据模型. MVC模型 MVC模型包含所有应用程序逻辑(业务逻辑.验证逻辑.数据访问逻辑),除了纯视图和控制器逻辑. 通过MVC,模型可保存并操作应用程序数据. Models文件夹 Mod ...

  4. C# 数组排序带索引

    想到了两种方法来实现,分别利用了List.Sort()和Dictionary.OrderBy()方法,代码如下: , , , , , , , , , }; //List.Sort() List< ...

  5. whois

    import 'dart:io'; import 'dart:convert'; main()async{ List a = ['1.cn','2.cn','3.cn','4.cn','5.cn',' ...

  6. element-ui 穿梭框使用axios数据查询

    //class="input"样式自写,用来覆盖穿梭框自带的搜索,它自带的搜索框不能搜索外部数据,只能查询在穿梭框内的数据 <div style="text-ali ...

  7. 启动Nginx服务失败:Job for nginx.service failed because the control process exited with error code. See "systemctl status nginx.service" and "journalctl -xe" for details.

    首次接触nginx,安装完使用命令 service nignx restart  后,出现这个错误,并按照提示给出的命令查看错误详情  systemctl status nginx.service   ...

  8. android RecyclerView的Grid布局案例

    1.先创建activity_grid.xml 和 activity_grid_item.xml <?xml version="1.0" encoding="utf- ...

  9. toString()和equals()方法详解

    一:toString()方法 Object中toString方法 public String toString() { return getClass().getName() + "@&qu ...

  10. Debian9.5系统安装

    1.镜像下载地址 http://cdimage.debian.org/cdimage/archive/ 2.开始安装 如果有配置网络地址,可以手动配置或者跳过等系统安装好后配置.  至此debian9 ...