【2016NOI十连赛2-2】黑暗

题目大意:定义一个无向图的权值为连通块个数的\(m\)次方。求\(n\)个点的所有无向图的权值和。多次询问。

数据范围:\(T\leq 1000,n\leq 30000,m\leq 15\)

我们使用用第二类斯特林数转换\(n^m\)。

\[n^m=\sum_{i=0}^m\binom{n}{i}i!\begin{Bmatrix}m\\i\end{Bmatrix}
\]

我们观察这个式子,相当于在\(n\)个连通块中选一个大小为\(i\)的子集,其贡献为\(i!\begin{Bmatrix}m\\i\end{Bmatrix}\)

我们设\(f_n\)表示\(n\)个点的无向连通图的数量,\(g_{n,m}\)表示\(n\)个点,\(m\)个连通块的数量。则答案为:

\[\sum_{j=1}^mj!\begin{Bmatrix}m\\j\end{Bmatrix}\sum_{i=j}^ng_{i,j}\binom{n}{i}2^{\binom{n-i}{2}}
\]

设\(A(x)=\sum \frac{2^{\binom{i}{2}}}{i!}x^i\),也就是无向图的\(OGF\)。设\(F(x)=\sum \frac{f_i}{i!}\)。

因为:

\[A(x)=\sum_{i}\frac{F(x)^i}{i}=\exp(F(x))\\
\]

所以:

\[\Rightarrow F(x)=\ln(A(x))
\]

代码:

#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】黑暗的更多相关文章

  1. 【CJOJ P1957】【NOIP2010冲刺十模拟赛】数字积木

    [NOIP2010冲刺十模拟赛]数字积木 Description 小明有一款新式积木,每个积木上都有一个数,一天小明突发奇想,要是把所有的积木排成一排,所形成的数目最大是多少呢? 你的任务就是读入n个 ...

  2. C#和ASP.Net面试题目集锦

    1.有哪几种方法可以实现一个类存取另外一个类的成员函数及属性,并请举列来加以说明和分析.2.A类是B类的基类,并且都有自己的构造,析构函数,请举例证明B类从实例化到消亡过程中构造,析构函数的执行过程. ...

  3. .net面式题

    .Net httphandler与httpmodule区别 动态控件在postback能否保存下来(不能) 序列化(对象到其他格式(xml/json/byte...)JavaScriptSeriali ...

  4. 第十届蓝桥杯省赛JavaB组个人题解

    前言 以下的第十届蓝桥杯Java B组省赛的题目题解只是我个人的题解,提供一些解题思路,仅作参考,如有错误,望大家指出,不甚感激,我会及时更改. 试题 A: 组队 ----- 答案:490 [问题描述 ...

  5. 惨痛第十届蓝桥杯总结(附录蓝桥省赛知识点总结)-C++ B组

    虽然目前距离蓝桥省赛仅仅过去一天但昨天下午和大神对答案的感觉依旧..... 现在深刻里理解到了为啥大神老是说咱们蓝桥叫 阅读理解杯(现在我非常认同这种说法啊...) 虽然第一次参加,赛前紧张提前30分 ...

  6. Minieye杯第十五届华中科技大学程序设计邀请赛现场同步赛 I Matrix Again

    Minieye杯第十五届华中科技大学程序设计邀请赛现场同步赛 I Matrix Again https://ac.nowcoder.com/acm/contest/700/I 时间限制:C/C++ 1 ...

  7. 第十届蓝桥杯2019年C/C++ 大学B组省赛试题

    2019年第十届蓝桥杯大赛软件类省赛C/C++大学B组 试题 A:组队 本题总分:5分 [问题描述] 作为篮球队教练,你需要从以下名单中选出 1号位至 5号位各一名球员, 组成球队的首发阵容. 每位球 ...

  8. 第十届蓝桥杯2019年C/C++ 大学A组省赛试题

    2019年蓝桥杯第十届软件类省赛 C/C++ 大 学 A 组 试题 A: 平方和 本题总分:5 分 [问题描述] 小明对数位中含有 2.0.1.9 的数字很感兴趣,在 1 到 40 中这样的数包括 1 ...

  9. 记第十四届省赛参赛体会&第十三届

    emmm....时间还是很久远了 还是流水账 这次比赛我还是挺开心的 因为感觉我们余神就是一把宝剑,然后我是她的Buff 前面四道题就挺顺利都1A过了,十年余神就是强无敌呀 最后两分钟过了第五题,银牌 ...

随机推荐

  1. Zstack的安装部署

    ZStack是下一代开源的云计算IaaS(基础架构即服务)软件. 它主要面向的是未来的智能数据中心,通过提供全完善的API来管理包括计算.存储和网络在内的数据中心的各种资源.跟OpenStack相比, ...

  2. VMware虚拟机Linux配置

    1.设置时区和时间 打开虚拟机,设置好用户名和密码,就可以进入了. 进入之后,可以先设置时区和时间 在CentOS桌面右上角,点击时间,然后进行设置 2.添加用户使用root权限 安装虚拟机之后,登录 ...

  3. TP验证规则Validate

    use think\Validate; <?php namespace app\common\model; use think\Validate; use think\Db; class Inv ...

  4. OS X 下 OpenGL 4.x 环境配置

    配置: OS X 10.10 + CMake 3.2.2 + GLFW 3.1.1 + OpenGL 4.1 + Xcode 6.0 本文主要介绍如何在 OS X 系统下进行环境配置,使得 Xcode ...

  5. select同时获取value和label的值

    Element ui 框架型 <el-select v-model="sketchID" autocomplete="off" @@change=&quo ...

  6. RTX5的汽车级,工业级,医疗和铁路安全认证已经通过,证书已颁发

    说明: 1.当前RTX5的教程已经在制作中,使用CMSIS-RTOS V2封装层,含FreeRTOS,配套V7,V6和V5板子​. 2.我们各种开发板和模块的资料汇总贴,搞了个cnblogs,临时先用 ...

  7. 1025 PAT Ranking 双重排序

    Programming Ability Test (PAT) is organized by the College of Computer Science and Technology of Zhe ...

  8. Netty服务端Channel的创建与初始化

    Netty创建服务端Channel时,从服务端 ServerBootstrap 类的 bind 方法进入,下图是创建服务端Channel的函数调用链.在后续代码中通过反射的方式创建服务端Channel ...

  9. MyBatis框架之第二篇

    1.高级参数映射和返回值映射(重点) a)Pojo包装pojo的参数映射 b)当结果集列名与pojo属性名不一致的返回值映射 2.动态sql(重点) 3.关联查询结果(重点) a)一对一关联结果 b) ...

  10. Thymeleaf对象的使用:日期对象

    Thymeleaf在模板中使用 #dates 或 #calendars 两个对象来处理日期,这两个对象大部分类似. 开发环境:IntelliJ IDEA 2019.2.2Spring Boot版本:2 ...