BZOJ5093 图的价值(NTT+斯特林数)
显然每个点会提供相同的贡献。于是现在只考虑1号点的贡献。若其度数为i,则在2~n号点选i个连上,剩下的边随便连,这样可以算出答案为
这个式子可以O(n)计算。发现k比较小,于是考虑如何将这个式子化为与k有关的求和。
显然前面一部分可以直接提走。考虑后面一部分的组合意义:n-1个有标号盒子里面选i个,放进去k个球的方案数
可以对这个过程进行变换:把k个球放在n-1个有标号盒子里,有球的盒子必须选,没有的可选可不选的方案数
枚举有球的盒子有多少个,可以发现答案变成了一个与k有关的式子:
S(k,i)为第二类斯特林数,也即将k个小球放进i个盒子(每个盒子非空)的方案数。
问题变为快速求斯特林数。可以用容斥原理推导出斯特林数卷积形式的通项公式:
即给盒子标上号,枚举有几个空盒。再化一下:
这样卷积形式就很明显了。用NTT算一下即可。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
int read()
{
int x=,f=;char c=getchar();
while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return x*f;
}
#define P 998244353
#define N 300000
int n,k,a[N],v[N<<],s[N<<],inv[N],ans,ans2;
int t,r[N<<];
int ksm(int a,int k)
{
if (k==) return ;
int tmp=ksm(a,k>>);
if (k&) return 1ll*tmp*tmp%P*a%P;
else return 1ll*tmp*tmp%P;
}
void inc(int &x,int y){x+=y;if (x>=P) x-=P;}
void DFT(int n,int *a,int p)
{
for (int i=;i<n;i++) if (i<r[i]) swap(a[i],a[r[i]]);
for (int i=;i<=n;i<<=)
{
int wn=ksm(p,(P-)/i);
for (int j=;j<n;j+=i)
{
int w=;
for (int k=j;k<j+(i>>);k++,w=1ll*w*wn%P)
{
int x=a[k],y=1ll*w*a[k+(i>>)]%P;
a[k]=(x+y)%P;a[k+(i>>)]=(x-y+P)%P;
}
}
}
}
int main()
{
freopen("bzoj5093.in","r",stdin);
freopen("bzoj5093.out","w",stdout);
n=read(),k=read();
ans=1ll*n*ksm(,1ll*(n-)*(n-)/%(P-))%P;
n--;
inv[]=;
for (int i=;i<=max(,min(n,k));i++) inv[i]=(P-1ll*(P/i)*inv[P%i]%P)%P;
a[]=ksm(,n);
for (int i=;i<=min(n,k);i++)
a[i]=1ll*a[i-]*inv[]%P*(n-i+)%P;
v[]=;
for (int i=;i<=min(n,k);i++)
v[i]=(P-1ll*v[i-]*inv[i]%P)%P;
s[]=;int facinv=;
for (int i=;i<=min(n,k);i++)
{
facinv=1ll*facinv*inv[i]%P;
s[i]=1ll*ksm(i,k)*facinv%P;
}
t=;while (t<=(min(n,k)<<)) t<<=;
for (int i=;i<t;i++) r[i]=(r[i>>]>>)|(i&)*(t>>);
DFT(t,s,),DFT(t,v,);
for (int i=;i<t;i++) s[i]=1ll*s[i]*v[i]%P;
DFT(t,s,inv[]);
int p=ksm(t,P-);
for (int i=;i<t;i++) s[i]=1ll*s[i]*p%P;
for (int i=;i<=min(n,k);i++)
inc(ans2,1ll*a[i]*s[i]%P);
ans=1ll*ans*ans2%P;
cout<<ans;
fclose(stdin);fclose(stdout);
return ;
}
BZOJ5093 图的价值(NTT+斯特林数)的更多相关文章
- 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]图的价值(NTT+第二类Stirling数)
5093: [Lydsy1711月赛]图的价值 Time Limit: 30 Sec Memory Limit: 256 MBSubmit: 250 Solved: 130[Submit][Sta ...
- 【题解】BZOJ5093图的价值(二项式+NTT)
[题解]BZOJ5093图的价值(二项式+NTT) 今天才做这道题,是我太弱了 强烈吐槽c++这种垃圾语言tmd数组越界不re反倒去别的数组里搞事情我只想说QAQ 推了一张A4纸的式子 考虑每个点的度 ...
- [CF932E]Team Work & [BZOJ5093]图的价值
CF题面 题意:求\(\sum_{i=0}^{n}\binom{n}{i}i^k\) \(n\le10^9,k\le5000\) 模\(10^9+7\) BZOJ题面 题意:求\(n*2^{\frac ...
- bzoj5093:图的价值(第二类斯特林数+NTT)
传送门 首先,题目所求为\[n\times 2^{C_{n-1}^2}\sum_{i=0}^{n-1}C_{n-1}^ii^k\] 即对于每个点\(i\),枚举它的度数,然后计算方案.因为有\(n\) ...
- BZOJ5093图的价值(斯特林数)
题目描述 “简单无向图”是指无重边.无自环的无向图(不一定连通). 一个带标号的图的价值定义为每个点度数的k次方的和. 给定n和k,请计算所有n个点的带标号的简单无向图的价值之和. 因为答案很大,请对 ...
- bzoj 5093 [Lydsy1711月赛]图的价值 NTT+第二类斯特林数
[Lydsy1711月赛]图的价值 Time Limit: 30 Sec Memory Limit: 256 MBSubmit: 245 Solved: 128[Submit][Status][D ...
- bzoj5093图的价值:多项式,斯特林数(二项式反演)
Description “简单无向图”是指无重边.无自环的无向图(不一定连通). 一个带标号的图的价值定义为每个点度数的k次方的和. 给定n和k,请计算所有n个点的带标号的简单无向图的价值之和. 因为 ...
随机推荐
- Tensorflow[LSTM]
0.背景 通过对<tensorflow machine learning cookbook>第9章第3节"implementing_lstm"进行阅读,发现如下形式可以 ...
- 安装Drush工具 -Centos
Drush可以说是Drupal的瑞士***,只要你使用过一段时间的Drush,一但没有它的话,你会觉得很不方便.可如果通过我在前面博文中所讲的方法来安装Drush的话,是不能够支持Drupal8的,所 ...
- SpringMVC之编程式校验
1.编程式效验需要实现Validator接口,针对模型类进行校验2.jar包 3.项目测试结构 4.StudentModel.java(模型类) package com.wt.entity; publ ...
- Linux ip forward
Linux 默认带有 ip forward 功能,只不过因为各种原因,默认的配置把该功能关闭了.本文通过 demo 来演示 Linux 的 ip forward 功能,具体场景为:开启 Linux 的 ...
- 时区提示:Local time zone must be set--see zic manual page 2018的解决办法
问题描述:在centos服务器上执行date命令时,显示的时间信息中的时区不正常,如下: [root@ulocalhost ~]# date Mon Apr 9 02:57:38 Local time ...
- Linux下monit进程管理操作梳理
Monit对运维人员来说可谓神器,它是一款功能非常丰富的进程.文件.目录和设备的监测工具,用于Unix平台.它可以自动修复那些已经停止运作的程序,特使适合处理那些由于多种原因导致的软件错误.Monit ...
- Centos7.2下OpenVPN 环境完整部署记录
关于OpenVPN的有关介绍及为何使用OpenVPN在此就不做赘述了,下面直接记录Centos7.2系统下部署OpenVPN环境的操作过程: 1) 先将本机的yum换成阿里云的yum源 [root@t ...
- Ceph常规操作及常见问题梳理
Ceph集群管理 每次用命令启动.重启.停止Ceph守护进程(或整个集群)时,必须指定至少一个选项和一个命令,还可能要指定守护进程类型或具体例程. **命令格式如 {commandline} [opt ...
- 回顾:前端模块化和AMD、CMD规范(全)
先列举下一些著名言论: "我想定义一个 each 方法遍历对象,但页头的 util.js 里已经定义了一个,我的只能叫 eachObject 了,好无奈." "Requi ...
- 补充照片:某基同学使用Bing词典
某基同学使用Bing词典的照片