题目描述

求所有\(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. Java基础-异常、断言

    处理错误 如果Java程序运行期间出现了错误,并且由于出现错误导致某些操作没有完成,程序应该能够返回到一种安全状态,并能够让用户执行一些其他的命令:或者允许用户保存所有操作结果,并以妥善的方式终止程序 ...

  2. 四款让你绝对上瘾的手机APP 用一次就会爱不释手

    如今我们出门在外,无时无刻不都在使用手机,在外游玩吃饭.乘地铁公交.购物逛街等,只要有手机不需要现金就可以完成这些事情,手机功能我们每天都在使用着,不用多说,大家都知道手机的重要性. 下面就是分享福利 ...

  3. Dart语言入门(一)

    Dart 语言介绍 Dart 是谷歌在 2011 年推出的编程语言,是一种结构化 Web 编程语言,允许用户通过 Chromium 中所整合的虚拟机(Dart VM)直接运行 Dart 语言编写的程序 ...

  4. Android Studio 添加引用Module项目

    新建Android项目,修改为Module 新建一个android项目 给项目命名,这里命名为MyLibrary,作为可引用的Module项目 点击下一步,选择一个Activity,点击ok 下面将这 ...

  5. Window10上安装Redis及其客户端

    资源下载地址 Redis安装包:https://github.com/MicrosoftArchive/redis/releases Redis客户端: 链接:https://pan.baidu.co ...

  6. .net解析csv(C#导表工具)

    前言 解析Excel有知名的NPOI库,(Java语言是POI),但是NPOI是不支持解析csv的. csv本质上也是文本文件,可以进行差异对比,更利于解决冲突. 本文对解析csv的几个.net的开源 ...

  7. 一个简易的kmp教学并给出java实现

    简单介绍一下问题 给定source字符串,找出target字符串出现的首位 例如 source   为“abddabddabc” target 为 “abddabc” 从第一位开始比较 |a b d ...

  8. zabbix-agent(zabbix-proxy)配置

    PidFile=/var/run/zabbix/zabbix_agentd.pidLogFile=/var/log/zabbix/zabbix_agentd.logLogFileSize=30Serv ...

  9. Day 2 下午

    [POJ 3468]A Simple Problem with Integers给定Q个数A1, ..., AQ,多次进行以下操作:1.对区间[L, R]中的每个数都加n.2.求某个区间[L, R]中 ...

  10. Web前端之iframe详解

    iframe基本内涵 通常我们使用iframe直接直接在页面嵌套iframe标签指定src就可以了. <iframe src="demo_iframe_sandbox.htm" ...