luogu

description

对于\(x\in[1,n]\)求\(x\)点强联通竞赛图中的哈密顿回路的期望个数膜\(998244353\)。

\(n\le10^5\)

sol

首先\(n\)点竞赛图中的哈密顿回路总共有\(\frac{n!2^{\binom n2-n}}{n}\)条。

(本质不同的有\(\frac{n!}{n}\)条,每条都存在于\(2^{\binom n2-n}\)个图内)

所以问题在于如何求\(n\)点强联通竞赛图的个数。

考虑一个\(O(n^2)\)的\(dp\),设\(f_i\)表示\(i\)个点的强联通竞赛图个数。

同时设\(g_i\)表示\(i\)个点的竞赛图个数,显然\(g_i=2^{\binom n2}\)。

转移时枚举拓扑序最小的强联通分量的大小。

\[f_i=g_i-\sum_{j=1}^{i-1}f_j\times\binom ij\times g_{i-j}
\]

然后用分治\(FFT\)可以做到两只\(\log\)。

这里讲一种生成函数的做法。

把转移式移项可得:

\[g_i=\sum_{j=1}^{i}f_j\times \binom ij\times g_{i-j}
\]

两边同除以\(i!\):

\[\frac{g_i}{i!}=\sum_{j=1}^{i}\frac{f_j}{j!}\times\frac{g_{i-j}}{(i-j)!}
\]

令:\(F(x)=\sum_{i=0}^{n}\frac{f_i}{i!}x^i,G(x)=\sum_{i=0}^{n}\frac{g_i}{i!}x^i,C(x)=\sum_{i=1}^{n}\frac{g_i}{i!}x^i\)

(注意\(G(x)\)和\(C(x)\)的区别)

那么\(F(x)G(x)=C(x)\),所以\(F(x)=\frac{C(x)}{G(x)}\)

多项式求逆即可,复杂度\(O(n\log n)\)。

code

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int N = 8e5+5;
const int mod = 998244353;
int n,jc[N],jcn[N],f[N],g[N],h[N],rev[N],og[N];
int fastpow(int a,int b){
int res=1;
while (b) {if (b&1) res=1ll*res*a%mod;a=1ll*a*a%mod;b>>=1;}
return res;
}
void ntt(int *P,int opt,int len){
int l=0;while((1<<l)<len)++l;--l;
for (int i=0;i<len;++i) rev[i]=(rev[i>>1]>>1)|((i&1)<<l);
for (int i=0;i<len;++i) if (i<rev[i]) swap(P[i],P[rev[i]]);
for (int i=1;i<len;i<<=1){
int W=fastpow(3,(mod-1)/(i<<1));
if (opt==-1) W=fastpow(W,mod-2);
og[0]=1;for (int j=1;j<i;++j) og[j]=1ll*og[j-1]*W%mod;
for (int p=i<<1,j=0;j<len;j+=p)
for (int k=0;k<i;++k){
int x=P[j+k],y=1ll*og[k]*P[j+k+i]%mod;
P[j+k]=(x+y)%mod,P[j+k+i]=(x-y+mod)%mod;
}
}
if (opt==-1) for (int i=0,Inv=fastpow(len,mod-2);i<len;++i) P[i]=1ll*P[i]*Inv%mod;
}
int A[N],B[N];
void GetInv(int *a,int *b,int len){
if (len==1) {b[0]=fastpow(a[0],mod-2);return;}
GetInv(a,b,len>>1);
for (int i=0;i<len;++i) A[i]=a[i],B[i]=b[i];
ntt(A,1,len<<1);ntt(B,1,len<<1);
for (int i=0;i<(len<<1);++i) A[i]=1ll*A[i]*B[i]%mod*B[i]%mod;
ntt(A,-1,len<<1);
for (int i=0;i<len;++i) b[i]=((b[i]+b[i])%mod-A[i]+mod)%mod;
for (int i=0;i<(len<<1);++i) A[i]=B[i]=0;
}
int main(){
scanf("%d",&n);
jc[0]=1;
for (int i=1;i<=n;++i) jc[i]=1ll*jc[i-1]*i%mod;
jcn[n]=fastpow(jc[n],mod-2);
for (int i=n;i;--i) jcn[i-1]=1ll*jcn[i]*i%mod;
int len=1;while (len<=(n<<1)) len<<=1;
for (int i=0;i<=n;++i) f[i]=h[i]=1ll*fastpow(2,1ll*i*(i-1)/2%(mod-1))*jcn[i]%mod;
GetInv(f,g,len);
for (int i=n+1;i<len;++i) f[i]=g[i]=0;h[0]=0;
ntt(g,1,len);ntt(h,1,len);
for (int i=0;i<len;++i) g[i]=1ll*g[i]*h[i]%mod;
ntt(g,-1,len);printf("1\n-1\n");
for (int i=3;i<=n;++i){
g[i]=1ll*g[i]*jc[i]%mod;
int res=1ll*jc[i]*fastpow(2,(1ll*i*(i-1)/2-i)%(mod-1))%mod*fastpow(i,mod-2)%mod;
printf("%d\n",1ll*res*fastpow(g[i],mod-2)%mod);
}
return 0;
}

[Luogu4233]射命丸文的笔记的更多相关文章

  1. Luogu4233 射命丸文的笔记 DP、多项式求逆

    传送门 注意到总共有\(\frac{n!}{n}\)条本质不同的哈密顿回路,每一条哈密顿回路恰好会出现在\(2^{\binom{n}{2} - n}\)个图中,所以我们实际上要算的是强连通有向竞赛图的 ...

  2. LuoguP4233 射命丸文的笔记

    题目描述 求所有\(n\)个点带标号强连通竞赛图中哈密顿回路数量的平均值. 题解 因为要求平均数,所以我们可以把分母和分子单开来算. \(n\)个点的所有竞赛图的所有哈密顿回路个数是可以求出来的,就是 ...

  3. P4233 射命丸文的笔记

    思路 题目要求求的是哈密顿回路的期望数量,实际上就是哈密顿回路的总数/有哈密顿回路的竞赛图的数量 n个点的所有竞赛图中哈密顿回路的总数为 \[ (n-1)! 2^{\frac{n(n-1)}{2}-n ...

  4. 洛谷P4233 射命丸文的笔记 【多项式求逆】

    题目链接 洛谷P4233 题解 我们只需求出总的哈密顿回路个数和总的强联通竞赛图个数 对于每条哈密顿回路,我们统计其贡献 一条哈密顿回路就是一个圆排列,有\(\frac{n!}{n}\)种,剩余边随便 ...

  5. ZJOI2019一轮停课刷题记录

    Preface 菜鸡HL终于狗来了他的省选停课,这次的时间很长,暂定停到一试结束,不过有机会二试的话还是可以搞到4月了 这段时间的学习就变得量大而且杂了,一般以刷薄弱的知识点和补一些新的奇怪技巧为主. ...

  6. 省选前的th题

    沙茶博主终于整完了知识点并学完了早该在NOIP之前学的知识们 于是终于开始见题了,之前那个奇怪的题单的结果就是这个了 题目按沙茶博主的做题顺序排序 个人感觉(暂时)意义不大的已被自动忽略 洛谷 491 ...

  7. git-简单流程(学习笔记)

    这是阅读廖雪峰的官方网站的笔记,用于自己以后回看 1.进入项目文件夹 初始化一个Git仓库,使用git init命令. 添加文件到Git仓库,分两步: 第一步,使用命令git add <file ...

  8. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  9. SQL Server技术内幕笔记合集

    SQL Server技术内幕笔记合集 发这一篇文章主要是方便大家找到我的笔记入口,方便大家o(∩_∩)o Microsoft SQL Server 6.5 技术内幕 笔记http://www.cnbl ...

随机推荐

  1. [postgreSql]postgreSql数据库、模式、表、函数的删除与创建

    1.删除/新增数据库    DROP DATABASE "testDB";    CREATE DATABASE "testDB" WITH OWNER = t ...

  2. zoj4028 LIS,差分约束

    题意:给你以i为结尾的最长上升子序列的值,和每个值的区间范围求可行的a[i] 题解:差分约束,首先满足l[i]<=a[i]<=r[i],可以建一个虚拟节点n+1,那么有a[n+1]-a[i ...

  3. python 数组中如何根据值,获取索引,如何根据索引删除值 , 以及如何根据值删除值

    假设有一数组 s = [1,2,3,4,5,6,7,8,9] (1)如何根据值获取索引 ,如果值为5 , 那对应的索引为? (2)如何根据索引删除值 , 删除数组中索引5对应的值: (3)根据数组中的 ...

  4. SPOJ-ANDROUND -线段树/与操作

    ANDROUND - AND Rounds #tree You are given a cyclic array A having N numbers. In an AND round, each e ...

  5. NetHogs 实时检测网络流量 转

    有很多适用于Linux系统的开源网络监视工具.比如说,你可以用命令iftop来检查带宽使用情况. netstat用来查看接口统计报告,还有top监控系统当前运行进程.但是如果你想要找一个能够按进程实时 ...

  6. Linux 忘记密码解决方法,Linux 远程登录

    一.Linux 忘记密码解决方法 很多朋友经常会忘记Linux系统的root密码,linux系统忘记root密码的情况该怎么办呢?重新安装系统吗?当然不用!进入单用户模式更改一下root密码即可. 步 ...

  7. Tree各种遍历实现

    数据结构.算法及应用 张宪超主编 科学出版社 1. 数据结构的基本概念知识 数据结构的逻辑结构由数据节点和连接两个节点的边组成. 数据节点的数据类型:整型,实数型,布尔型,字符型,指针数据类型 结构的 ...

  8. 为eclipse EE(汉化版) 配置Tomcat服务器

    为eclipse EE(汉化版) 配置Tomcat服务器   很多小朋友在初次使用eclipse进行web开发的时候,很是蒙蔽.以前都是文本编辑器写好,做好目录结构,往tomcat下一扔,重启,搞定. ...

  9. eureka-4-eureka server 高可用

    Eureka Server 可以通过运行多个实例并相互注册实现高可用部署.Eureka Server 实例之间会彼此增量同步信息,确保所有节点信息一致. 关键点: 配置: eureka.client. ...

  10. background-size: contain 与cover的区别,以及ie78的兼容写法

    一:background-size: contain 与cover的区别: 作用: 都是将图片以**相同宽高比**缩放以适应整个容器的宽高. 不同之处在于: 1.  在no-repeat情况下,如果容 ...