LuoguP4233 射命丸文的笔记
题目描述
求所有\(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;
}
转载于:https://www.cnblogs.com/ZH-comld/p/10592125.html
LuoguP4233 射命丸文的笔记相关推荐
- 【LuoguP4233】射命丸文的笔记-多项式求逆
测试地址:射命丸文的笔记 做法:本题需要用到多项式求逆. 首先,要求存在哈密顿回路的竞赛图的哈密顿回路期望数量,就是用哈密顿回路的总数除以存在哈密顿回路的竞赛图数量. 要考虑所有竞赛图的哈密顿回路数量 ...
- P4233 射命丸文的笔记
P4233 射命丸文的笔记 官方题解 题意 如果一个竞赛图含有哈密顿回路,则称这张竞赛图为值得记录的 从所有含有n个顶点(顶点互不相同)的,值得记录的竞赛图中等概率随机选取一个 求选取的竞赛图中哈密顿 ...
- 洛谷 P4233 射命丸文的笔记 ntt
题目背景 (七)再见,地底世界的朋友们 在地灵殿住了许多天了呢. 这些日子里,觉分享了很多旧地狱的故事. 此次地底旅行,可以说是非常充实了. 虽然仍旧有些不舍,不过人类总是要见太阳的,再说这样麻烦觉姐 ...
- 洛谷 P4233 射命丸文的笔记 题解
题目传送门 题目大意: 求 nnn 个点的强连通竞赛图中的哈密顿回路的期望个数. 题解 答案需要求期望个数,那么只需要求出总的哈密顿回路个数除以强联通竞赛图个数即可. 设 s[i]s[i]s[i] 表 ...
- luogu P4233 射命丸文的笔记
题意: 给出nnn,求对于任意的1≤i≤n" role="presentation" style="position: relative;">1 ...
- [洛谷P4233]射命丸文的笔记
[题目大意] 如果一个竞赛图含有哈密顿回路,则称这张竞赛图为值得记录的 从所有含有nnn个顶点(顶点互不相同)的,值得记录的竞赛图中等概率随机选取一个 求选取的竞赛图中哈密顿回路数量的期望 输出答案除 ...
- 洛谷P4233 射命丸文的笔记 分治NTT+竞赛图
Description 给定n 对于i从1~n,输出i个点组成竞赛图中,哈密顿回路的平均数量 Solution 竞赛图存在哈密顿回路的充要条件就是强连通 设f(n)f(n)f(n)表示n个点形成强连通 ...
- 洛谷P4233 射命丸文的笔记 【多项式求逆】
题目链接 洛谷P4233 题解 我们只需求出总的哈密顿回路个数和总的强联通竞赛图个数 对于每条哈密顿回路,我们统计其贡献 一条哈密顿回路就是一个圆排列,有\(\frac{n!}{n}\)种,剩余边随便 ...
- 【洛谷P4233】— 射命丸文的笔记(竞赛图+多项式求逆)
传送门 考虑强连通竞赛图哈密顿回路总数很好求 为(n−1)!2(n2)−n(n-1)!2^{{n\choose 2}-n}(n−1)!2(2n)−n 现在问题是求强连通竞赛图数 设fif_ifi为 ...
最新文章
- Sublime Text安装与使用
- 用 javascript 获取当页面上鼠标(光标)位置
- mysql之间互相订阅_mysql – 开票和订阅的应用程序逻辑?
- net Core做一个webApi的简单实例
- java - 水仙花数
- Windows下将jar包封装成服务程序
- sqlserver 获取当前操作的数据库名称
- 毕设题目:Matlab语音处理
- ajax打开新窗口被浏览器拦截的解决办法
- HTML概述+HTML核心(HTML知识点总结)
- Win7安全模式卡在ClassPNP sys位置解决办法之一
- 我的NVIDIA开发者之旅——NVIDIA云原生技术
- TVS管好,还是稳压二极管好?
- python海龟绘图教程自学网_通过海龟绘图学习Python-01
- 9 输入输出设备题库
- Java入门第一步---配置环境、安装工具(超级详细)
- Ubuntu USB设备端口号绑定
- 常见硬件接口汇总(未完待续)
- 第八届蓝桥杯 拉马车JAVA暴解
- 尚学堂Java学习日记Day3
热门文章
- 切换输入法快捷键_输入法失灵怎么办?该怎么恢复?
- 设计模式 可复用面向对象软件的基础_面向对象的可复用设计模式之简单工厂模式(1/24)...
- 聚奎中学2021高考成绩查询,江津2017全体高考考生的喜报
- 【编程题】判断一个整数对应的二进制数是否是回文
- 理解主从设备模式(Master-Slave)
- 2021秋季跳槽必备:软件测试面试题(附带答案)备战金九银十!
- linux 内核 网卡驱动 移植,linux内核移植步骤添加dm9000网卡驱动(设备树).docx
- dump排查内存异常 java_如何排查Java应用内存泄漏问题
- layui tree ajax刷新,layer 刷新某个页面的实现方法
- 小分子php蛋白,如何研究小分子抑制蛋白降解途径? - 分子生物 - 小木虫 - 学术 科研 互动社区...