【2016NOI十连赛2-2】黑暗
【2016NOI十连赛2-2】黑暗
题目大意:定义一个无向图的权值为连通块个数的\(m\)次方。求\(n\)个点的所有无向图的权值和。多次询问。
数据范围:\(T\leq 1000,n\leq 30000,m\leq 15\)
我们使用用第二类斯特林数转换\(n^m\)。
\]
我们观察这个式子,相当于在\(n\)个连通块中选一个大小为\(i\)的子集,其贡献为\(i!\begin{Bmatrix}m\\i\end{Bmatrix}\)
我们设\(f_n\)表示\(n\)个点的无向连通图的数量,\(g_{n,m}\)表示\(n\)个点,\(m\)个连通块的数量。则答案为:
\]
设\(A(x)=\sum \frac{2^{\binom{i}{2}}}{i!}x^i\),也就是无向图的\(OGF\)。设\(F(x)=\sum \frac{f_i}{i!}\)。
因为:
\]
所以:
\]
代码:
#include<bits/stdc++.h>
#define ll long long
#define N 30005
using namespace std;
inline int Get() {
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9') {
if(ch=='-') f=-1;
ch=getchar();
}
while('0'<=ch&&ch<='9') {
x=(x<<1)+(x<<3)+ch-'0';
ch=getchar();
}
return x*f;
}
const ll mod=998244353;
ll ksm(ll t,ll x) {
ll ans=1;
for(;x;x>>=1,t=t*t%mod)
if(x&1) ans=ans*t%mod;
return ans;
}
int n,m;
void NTT(ll *a,int d,int flag) {
static int rev[N<<2];
static ll G=3;
int n=1<<d;
for(int i=0;i<n;i++) rev[i]=(rev[i>>1]>>1)|((i&1)<<d-1);
for(int i=0;i<n;i++) if(i<rev[i]) swap(a[i],a[rev[i]]);
for(int s=1;s<=d;s++) {
int len=1<<s,mid=len>>1;
ll w=flag==1?ksm(G,(mod-1)/len):ksm(G,mod-1-(mod-1)/len);
for(int i=0;i<n;i+=len) {
ll t=1;
for(int j=0;j<mid;j++) {
ll u=a[i+j],v=a[i+j+mid]*t%mod;
a[i+j]=(u+v)%mod;
a[i+j+mid]=(u-v+mod)%mod;
t=t*w%mod;
}
}
}
if(flag==-1) {
ll inv=ksm(n,mod-2);
for(int i=0;i<n;i++) a[i]=a[i]*inv%mod;
}
}
void Inv(ll *inv,int d,ll *a) {
static ll A[N<<2];
if(d==0) {
inv[0]=ksm(a[0],mod-2);
return ;
}
Inv(inv,d-1,a);
for(int i=1<<d;i<1<<d+1;i++) A[i]=inv[i]=0;
for(int i=0;i<1<<d;i++) A[i]=a[i];
NTT(inv,d+1,1),NTT(A,d+1,1);
for(int i=0;i<1<<d+1;i++) inv[i]=(2*inv[i]-A[i]*inv[i]%mod*inv[i]%mod+mod)%mod;
NTT(inv,d+1,-1);
for(int i=1<<d;i<1<<d+1;i++) inv[i]=0;
}
void Int(ll *f,int d) {
int n=1<<d;
for(int i=0;i<n-1;i++) f[i]=f[i+1]*(i+1)%mod;
f[n-1]=0;
}
void Der(ll *f,int d) {
int n=1<<d;
for(int i=n-1;i>0;i--) f[i]=f[i-1]*ksm(i,mod-2)%mod;
f[0]=0;
}
void Ln(ll *ln,int d,ll *a) {
static ll inv[N<<2],f[N<<2];
for(int i=0;i<1<<d+1;i++) inv[i]=f[i]=0;
for(int i=0;i<1<<d;i++) f[i]=a[i];
Inv(inv,d,a);
Int(f,d);
NTT(inv,d+1,1),NTT(f,d+1,1);
for(int i=0;i<1<<d+1;i++) f[i]=f[i]*inv[i]%mod;
NTT(f,d+1,-1);
Der(f,d);
for(int i=0;i<1<<d;i++) ln[i]=f[i];
}
ll fac[N],ifac[N];
ll S[20][20];
ll e[N];
ll C(int n,int m) {return fac[n]*ifac[m]%mod*ifac[n-m]%mod;}
void pre(int n,int m) {
for(int i=0;i<=n;i++) e[i]=ksm(2,i*(i-1)/2);
fac[0]=1;
for(int i=1;i<=n;i++) fac[i]=fac[i-1]*i%mod;
ifac[n]=ksm(fac[n],mod-2);
for(int i=n-1;i>=0;i--) ifac[i]=ifac[i+1]*(i+1)%mod;
S[0][0]=1;
for(int i=1;i<=m;i++)
for(int j=1;j<=i;j++)
S[i][j]=(S[i-1][j-1]+j*S[i-1][j])%mod;
}
ll f[N<<2],g[20][N<<2];
ll F[20][N];
void DP(int n,int m) {
static ll tem[N<<2];
static ll A[N<<2],B[N<<2];
for(int i=0;i<=n;i++) {
tem[i]=e[i]*ifac[i]%mod;
}
int d=ceil(log2(n+1));
Ln(f,d,tem);
for(int i=1;i<=n;i++) {
f[i]=f[i]*fac[i]%mod*ifac[i-1]%mod;
}
NTT(f,d+1,1);
g[0][0]=1;
for(int j=1;j<=m;j++) {
for(int i=0;i<=n;i++) g[j][i]=g[j-1][i]*ifac[i]%mod;
NTT(g[j],d+1,1);
for(int i=0;i<1<<d+1;i++) g[j][i]=g[j][i]*f[i]%mod;
NTT(g[j],d+1,-1);
for(int i=n+1;i<1<<d+1;i++) g[j][i]=0;
for(int i=1;i<=n;i++) g[j][i]=g[j][i]*fac[i-1]%mod;
}
for(int i=0;i<=n;i++) B[i]=e[i]*ifac[i]%mod;
NTT(B,d+1,1);
for(int j=1;j<=m;j++) {
for(int i=0;i<1<<d+1;i++) A[i]=0;
for(int i=1;i<=n;i++) A[i]=g[j][i]*ifac[i]%mod;
NTT(A,d+1,1);
for(int i=0;i<1<<d+1;i++) A[i]=A[i]*B[i]%mod;
NTT(A,d+1,-1);
for(int i=1;i<=n;i++) F[j][i]=A[i]*fac[i]%mod;
}
}
int main() {
pre(30000,15);
DP(30000,15);
int T=Get();
while(T--) {
n=Get(),m=Get();
ll ans=0;
for(int j=1;j<=m;j++) {
ll res=0;
(ans+=F[j][n]*fac[j]%mod*S[m][j])%=mod;
}
cout<<ans<<"\n";
}
return 0;
}
【2016NOI十连赛2-2】黑暗的更多相关文章
- 【CJOJ P1957】【NOIP2010冲刺十模拟赛】数字积木
[NOIP2010冲刺十模拟赛]数字积木 Description 小明有一款新式积木,每个积木上都有一个数,一天小明突发奇想,要是把所有的积木排成一排,所形成的数目最大是多少呢? 你的任务就是读入n个 ...
- C#和ASP.Net面试题目集锦
1.有哪几种方法可以实现一个类存取另外一个类的成员函数及属性,并请举列来加以说明和分析.2.A类是B类的基类,并且都有自己的构造,析构函数,请举例证明B类从实例化到消亡过程中构造,析构函数的执行过程. ...
- .net面式题
.Net httphandler与httpmodule区别 动态控件在postback能否保存下来(不能) 序列化(对象到其他格式(xml/json/byte...)JavaScriptSeriali ...
- 第十届蓝桥杯省赛JavaB组个人题解
前言 以下的第十届蓝桥杯Java B组省赛的题目题解只是我个人的题解,提供一些解题思路,仅作参考,如有错误,望大家指出,不甚感激,我会及时更改. 试题 A: 组队 ----- 答案:490 [问题描述 ...
- 惨痛第十届蓝桥杯总结(附录蓝桥省赛知识点总结)-C++ B组
虽然目前距离蓝桥省赛仅仅过去一天但昨天下午和大神对答案的感觉依旧..... 现在深刻里理解到了为啥大神老是说咱们蓝桥叫 阅读理解杯(现在我非常认同这种说法啊...) 虽然第一次参加,赛前紧张提前30分 ...
- Minieye杯第十五届华中科技大学程序设计邀请赛现场同步赛 I Matrix Again
Minieye杯第十五届华中科技大学程序设计邀请赛现场同步赛 I Matrix Again https://ac.nowcoder.com/acm/contest/700/I 时间限制:C/C++ 1 ...
- 第十届蓝桥杯2019年C/C++ 大学B组省赛试题
2019年第十届蓝桥杯大赛软件类省赛C/C++大学B组 试题 A:组队 本题总分:5分 [问题描述] 作为篮球队教练,你需要从以下名单中选出 1号位至 5号位各一名球员, 组成球队的首发阵容. 每位球 ...
- 第十届蓝桥杯2019年C/C++ 大学A组省赛试题
2019年蓝桥杯第十届软件类省赛 C/C++ 大 学 A 组 试题 A: 平方和 本题总分:5 分 [问题描述] 小明对数位中含有 2.0.1.9 的数字很感兴趣,在 1 到 40 中这样的数包括 1 ...
- 记第十四届省赛参赛体会&第十三届
emmm....时间还是很久远了 还是流水账 这次比赛我还是挺开心的 因为感觉我们余神就是一把宝剑,然后我是她的Buff 前面四道题就挺顺利都1A过了,十年余神就是强无敌呀 最后两分钟过了第五题,银牌 ...
随机推荐
- LeetCode刷题191203 --回溯算法
虽然不是每天都刷,但还是不想改标题,(手动狗头 题目及解法来自于力扣(LeetCode),传送门. 算法(78): 给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明: ...
- 阿里云ECS服务器部署HADOOP集群(七):Sqoop 安装
本篇将在 阿里云ECS服务器部署HADOOP集群(一):Hadoop完全分布式集群环境搭建 阿里云ECS服务器部署HADOOP集群(二):HBase完全分布式集群搭建(使用外置ZooKeeper) 阿 ...
- Hive部分函数解析
Hive部分函数解析 Hive里的exists ,in ,not exists ,not in 相关函数 表数据准备: 1.选择指定数据库 eg: use bg_database1; 2. 创建表 ...
- C#爬虫例子
公司需要抓取新闻,每次手动复制粘贴新闻,太麻烦了,业务人员就提出了要求,需要程序实现自动抓取新闻,因此就写了这个简单的爬虫程序. Html Agility Pack库 这是一个.NET下的HTML解析 ...
- (转)go新建文件权限与设置不符
原文:https://blog.csdn.net/lipengfeihb/article/details/54415283 一. 问题 fileName := "/Users/my/test ...
- Web前端基础(9):JavaScript(三)
1. 常用内置对象 所谓内置对象就是ECMAScript提供出来的一些对象,我们知道对象都是有相应的属性和方法. 1.1 数组Array 1.1.1 数组的创建方式 字面量方式创建(推荐大家使用这种方 ...
- PDF转换成DXF文件?PDF转DXF的操作方法
在CAD工作中,经常就需要将绘制完成的图纸文件的格式进行转换,那怎么将PDF文件转换成DXF格式的呢?具体要怎么来进行操作呢?本编教程小编就来教教大家具体操作方法,具体操作如下: 一.工具转换 推荐指 ...
- Cobalt Strike系列教程第三章:菜单栏与视图
通过前两章的学习,我们掌握了Cobalt Strike教程的基础知识,及软件的安装使用. Cobalt Strike系列教程第一章:简介与安装 Cobalt Strike系列教程第二章:Beacon详 ...
- sqlmap总结
转自:http://www.zerokeeper.com/web-security/sqlmap-usage-summary.html 0x01 需要了解 当给 sqlmap 这么一个 url 的时候 ...
- 使用 vs code 创建 Django 项目
操作流程: 1.前期准备工作 2.vs code配置Python环境 3.新建 Django 项目 4.vs code 配置 Debug Django 环境 5.浏览器查看效果 1.前期准备工作 安装 ...