题目描述

求所有\(n\)个点带标号强连通竞赛图中哈密顿回路数量的平均值.

题解

因为要求平均数,所以我们可以把分母和分子单开来算。

\(n\)个点的所有竞赛图的所有哈密顿回路个数是可以求出来的,就是可以枚举所有哈密顿回路,然后考虑它在多少张竞赛图中出现过,也就是:

\[ans=\frac{n!}{n}2^{\binom{n}{2}-n}
\]

也就是我们钦定了一条哈密顿回路之后,有\(n\)条边就固定不能选了,其他的边还是可以随便选的。

由于竞赛图强连通是竞赛图具有哈密顿回路的充分必要条件。

所以我们现在的任务就是求\(n\)个点的强连通竞赛图的个数。

可以\(dp\)一下这个东西。

\[f[i]=2^{\binom{i}{2}}-\sum_{j=1}^{j<i}f[j]\times \binom{i}{j}\times 2^{\binom{i-j}{2}}
\]

相当于是用总数容斥掉不强连通的方案数,后面是相当于枚举当前图缩完\(SCC\)之后拓扑序最小的\(SCC\)的大小,然后其他边是可以随便连的。

这个东西可以直接把组合数拆开\(CDQ\)求。

我们可以设\(g[i]=2^{\binom{i}{2}}\)特殊的,我们令\(g[0]=1,g[1]=1​\)。

\[f[i]=g[i]-\sum_{j=1}^{j<i}\frac{i!}{j!*(i-j)!}f[j]\times g[i-j]
\]

\[g[i]=\sum_{j=1}^{j\leq i}\frac{i!}{j!*(i-j)!}f[j]\times g[i-j]
\]

\[\frac{g[i]}{i!}=\sum_{j=1}^{j\leq i}\frac{f[j]}{j!}\times \frac{g[i-j]}{(i-j)!}
\]

这时我们可以令\(G[i]=\frac{g[i]}{i!},F[i]=\frac{f[i]}{i!}\),所以我们的形式变成了:

\[G[i]=\sum_{j=1}^{j \leq i}F[j]*G[j-i]
\]

然后根据分治\(FFT\)转多项式求逆的方法,可以表示为。

\[F*G+G_0=G
\]

\[G=\frac{G_0}{1-F}
\]

\[F=1-\frac{G_0}{G}
\]

然后就可以多项式求逆做了。

但是我感觉这样的话常数项好像不太对,但是这道题可以把前两项判掉,所以就无关紧要了。

代码

#include<iostream>
#include<cstdio>
#define N 270009
using namespace std;
typedef long long ll;
const ll G=3;
const int Gi=332748118;
const ll mod=998244353;
ll g[N],b[N],c[N],jie[N],ni[N];
int rev[N],n;
inline ll rd(){
ll x=0;char c=getchar();bool f=0;
while(!isdigit(c)){if(c=='-')f=1;c=getchar();}
while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
return f?-x:x;
}
inline void MOD(ll &x){x=x>=mod?x-mod:x;}
inline void MOD(int &x){x=x>=mod?x-mod:x;}
inline ll power(ll x,ll y){
ll ans=1;
while(y){if(y&1)ans=ans*x%mod;x=x*x%mod;y>>=1;}
return ans;
}
inline ll gi(ll x){return power(x,mod-2);}
inline ll C2(ll n){return n*(n-1)/2;}
inline void NTT(ll *a,int l,int tag){
for(int i=1;i<l;++i)if(i>rev[i])swap(a[i],a[rev[i]]);
for(int i=1;i<l;i<<=1){
ll wn=power(tag==1?G:Gi,(mod-1)/(i<<1));
for(int j=0;j<l;j+=(i<<1)){
ll w=1;
for(int k=0;k<i;++k,w=w*wn%mod){
ll x=a[j+k],y=a[i+j+k]*w%mod;
MOD(a[j+k]=x+y);MOD(a[i+j+k]=x-y+mod);
}
}
}
if(tag<0){
ll ny=power(l,mod-2);
for(int i=0;i<l;++i)a[i]=a[i]*ny%mod;
}
}
void getinv(ll *a,int len){
if(len==1){b[0]=power(a[0],mod-2);return;}
getinv(a,(len+1)>>1);
int l=1,L=0;
while(l<=(len<<1))l<<=1,L++;
for(int i=1;i<l;++i)rev[i]=rev[i>>1]>>1|((i&1)<<(L-1));
for(int i=0;i<len;++i)c[i]=a[i];
for(int i=len;i<l;++i)c[i]=0;
NTT(c,l,1);NTT(b,l,1);
for(int i=0;i<l;++i)b[i]=(2ll-c[i]*b[i]%mod+mod)*b[i]%mod;
NTT(b,l,-1);
for(int i=len;i<l;++i)b[i]=0;
}
int main(){
n=rd();
jie[0]=1;
for(int i=1;i<=n;++i)jie[i]=jie[i-1]*i%mod;ni[n]=power(jie[n],mod-2);
for(int i=n-1;i>=0;--i)ni[i]=ni[i+1]*(i+1)%mod;
g[0]=1;g[1]=1;
for(int i=2;i<=n;++i)g[i]=power(2,C2(i))*ni[i]%mod;
getinv(g,n+1);
for(int i=0;i<=n;++i)b[i]=(mod-b[i])*jie[i]%mod;
if(n>=1)puts("1");
if(n>=2)puts("-1");
for(int i=3;i<=n;++i){
ll num=jie[i]*gi(i)%mod*power(2,C2(i)-i)%mod;
printf("%lld\n",num*gi(b[i])%mod);
}
return 0;
}

LuoguP4233 射命丸文的笔记的更多相关文章

  1. P4233 射命丸文的笔记

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

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

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

  3. [Luogu4233]射命丸文的笔记

    luogu description 对于\(x\in[1,n]\)求\(x\)点强联通竞赛图中的哈密顿回路的期望个数膜\(998244353\). \(n\le10^5\) sol 首先\(n\)点竞 ...

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

    传送门 注意到总共有\(\frac{n!}{n}\)条本质不同的哈密顿回路,每一条哈密顿回路恰好会出现在\(2^{\binom{n}{2} - 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. EF 外键不显示、如何让外键显示!增、删、改 操作时,外键不显示,只显示导航属性!

    一.问题描述:EF 外键不显示.如何让外键显示!增.删.改 操作时,外键不显示,只显示导航属性! EF 添加.增加.插入数据时,外键不显示! 二.解决方案:在根据数据库生成模型的时候,选中“在模型中” ...

  2. Servlet常用的接口和类

    使用接口和类的作用:Servlet也是依靠继承父类和实现接口来实现的.使用Servlet必须要引入两个包:javax.servlet和javax.servlet.http.所有的Servlet应用都是 ...

  3. 5分钟掌握var,let和const异同

    转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者.原文出处:https://dzone.com/articles/javascript-difference-b ...

  4. linux 子系统折腾记 (三)

    所以说,英文真是个好东西,很多资料都只有英文版本,要是不懂英文,甚至你不知道这个资料的存在,更别提用蹩脚的翻译软件去翻译了. wsl 的资料:https://docs.microsoft.com/zh ...

  5. 商米D1S一体机设置搜狗手写输入法图解

    按照下图步骤,一步步设置即可,询问全新的时候需要点击允许. 商米应用市场搜索下载搜狗输入法,并安装 安装完成后,点击桌面搜狗输入法,选择启用搜狗输入法,如图 点击启用后,在虚拟键盘中选择搜狗输入法,并 ...

  6. MySQL 关于性能的参数配置梳理

    以下List是我们常见的MySQL参数配置,这个参数对提高实例的性能大有裨益. 其中 建议设置值,仅供参考,需要根据自己的业务场景和硬件资源仔细推敲. 参数 设置说明 建议设置值 lower_case ...

  7. 数据库原理 - 序列5 - 事务是如何实现的? - Undo Log解析

    本文节选自作者书籍<软件架构设计:大型网站技术架构与业务架构融合之道>.作者微信公众号:架构之道与术.公众号底部菜单有书友群可以加入,与作者和其他读者进行深入讨论.也可以在京东.天猫上购买 ...

  8. c/c++ 右值引用,forward关键字

    c++ forward关键字 forward的由来:模板函数中的推导类型,作为另一函数的参数时,不管实参是什么类型,作为另一个参数的实参时,都变成了左值.因为C++里规定函数的形参就是左值,不过调用侧 ...

  9. 【记录】使用在线KMS激活win10系统

    摘要 网上一些激活工具可能捆绑了木马.病毒.使用激活工具有风险.使用在线KMS来激活系统则没有这个风险.(自测至发布日期仍然可用) (有能力的请支持正版windows系统) 将kms服务器地址设置为k ...

  10. 理解jQuery的$.extend与$.fn.extend

    https://www.cnblogs.com/xuxiuyu/p/5989743.html 上面这篇博客总结的很棒!!,以下对自己的认识做一个总结 <!DOCTYPE html> < ...