P4233 射命丸文的笔记
思路
题目要求求的是哈密顿回路的期望数量,实际上就是哈密顿回路的总数/有哈密顿回路的竞赛图的数量
n个点的所有竞赛图中哈密顿回路的总数为
\]
每个哈密顿回路可以看成一个环,则经过的n个节点就是长度为n的一个排列,排列总数为\(n!\) 个,每个回路被计数了n次,有\((n-1)!\)种,剩下的\(\frac{n(n-1)}{2}-n\)条边随便连,有\(2^{\frac{(n-1)n}{2}-n}\)种
而强连通竞赛图中必有一个哈密顿回路
而i个点的竞赛图总数为
\]
设i个点的竞赛图总数为\(g_i=2^{\frac{i(i-1)}{2}}\),i个点强连通竞赛图总数为\(f_i\)
可以枚举拓扑序最小的强连通分量大小,然后用总数减去不强连通的竞赛图总数即可
为什么枚举拓扑序最小?因为枚举拓扑序最小同时确定了每条边的方向并保证了整个图不会强连通
\]
所以
\]
拆开组合数
\]
所以
\]
设\(F_i=\frac{f_i}{i!}\),\(G_i=\frac{g_i}{i!}\)
就变成了这样
\]
然后上分治FFT或者多项式求逆就好了
代码
#include <cstdio>
#include <algorithm>
#include <cstring>
#define int long long
using namespace std;
const int MAXN = 300000;
const int MOD = 998244353;
const int G = 3;
const int invG = 332748118;
int rev[MAXN];
void cal_rev(int n,int lim){
for(int i=0;i<n;i++)
rev[i]=(rev[i>>1]>>1)|((i&1)<<(lim-1));
}
int pow(int a,int b){
int ans=1;
while(b){
if(b&1)
ans=(1LL*ans*a)%MOD;
a=(1LL*a*a)%MOD;
b>>=1;
}
return ans;
}
void NTT(int *a,int opt,int n,int lim){
for(int i=0;i<n;i++)
if(i<rev[i])
swap(a[i],a[rev[i]]);
for(int i=2;i<=n;i<<=1){
int len=i/2,tmp=pow((opt)?G:invG,(MOD-1)/i);
for(int j=0;j<n;j+=i){
int arr=1;
for(int k=j;k<j+len;k++){
int t=(1LL*a[k+len]*arr)%MOD;
a[k+len]=(a[k]-t+MOD)%MOD;
a[k]=(a[k]+t)%MOD;
arr=(1LL*arr*tmp)%MOD;
}
}
}
if(!opt){
int invN = pow(n,MOD-2);
for(int i=0;i<n;i++)
a[i]=(1LL*a[i]*invN)%MOD;
}
}
void Inv(int *a,int *b,int dep,int &midlen,int &midlim){
if(dep==1){
b[0]=pow(a[0],MOD-2);
return;
}
Inv(a,b,(dep+1)>>1,midlen,midlim);
static int tmp[MAXN];
while((dep<<1)>midlen)
midlen<<=1,midlim++;
for(int i=0;i<dep;i++)
tmp[i]=a[i];
for(int i=dep;i<midlen;i++)
tmp[i]=0;
cal_rev(midlen,midlim);
NTT(b,1,midlen,midlim);
NTT(tmp,1,midlen,midlim);
for(int i=0;i<midlen;i++)
b[i]=1LL*b[i]*(2LL-1LL*b[i]*tmp[i]%MOD+MOD)%MOD;
NTT(b,0,midlen,midlim);
for(int i=dep;i<midlen;i++)
b[i]=0;
}
int jc[MAXN],jc_inv[MAXN],n;
void init(int n){
jc[0]=1;
for(int i=1;i<=n;i++)
jc[i]=(1LL*jc[i-1]*i)%MOD;
jc_inv[n]=pow(jc[n],MOD-2);
for(int i=n-1;i>=0;i--)
jc_inv[i]=(1LL*jc_inv[i+1]*(i+1))%MOD;
}
int f[MAXN],g[MAXN];
signed main(){
scanf("%lld",&n);
init(n);
int inv2=pow(2,MOD-2);
for(int i=1;i<=n;i++)
g[i]=(1LL*pow(2,(1LL*i*(i-1)/2)%(MOD-1))*jc_inv[i]%MOD);
g[0]=1;
int midlen=1,midlim=0;
Inv(g,f,n+1,midlen,midlim);
for(int i=1;i<=n;i++){
if(i==1)
printf("1\n");
else if(i==2)
printf("-1\n");
else
printf("%lld\n",MOD-1LL*jc[i-1]*pow(2,i*(i-3)/2%(MOD-1))%MOD*pow(1LL*f[i]*jc[i]%MOD,MOD-2)%MOD);
}
return 0;
}
P4233 射命丸文的笔记的更多相关文章
- 洛谷P4233 射命丸文的笔记 【多项式求逆】
题目链接 洛谷P4233 题解 我们只需求出总的哈密顿回路个数和总的强联通竞赛图个数 对于每条哈密顿回路,我们统计其贡献 一条哈密顿回路就是一个圆排列,有\(\frac{n!}{n}\)种,剩余边随便 ...
- LuoguP4233 射命丸文的笔记
题目描述 求所有\(n\)个点带标号强连通竞赛图中哈密顿回路数量的平均值. 题解 因为要求平均数,所以我们可以把分母和分子单开来算. \(n\)个点的所有竞赛图的所有哈密顿回路个数是可以求出来的,就是 ...
- [Luogu4233]射命丸文的笔记
luogu description 对于\(x\in[1,n]\)求\(x\)点强联通竞赛图中的哈密顿回路的期望个数膜\(998244353\). \(n\le10^5\) sol 首先\(n\)点竞 ...
- Luogu4233 射命丸文的笔记 DP、多项式求逆
传送门 注意到总共有\(\frac{n!}{n}\)条本质不同的哈密顿回路,每一条哈密顿回路恰好会出现在\(2^{\binom{n}{2} - n}\)个图中,所以我们实际上要算的是强连通有向竞赛图的 ...
- ZJOI2019一轮停课刷题记录
Preface 菜鸡HL终于狗来了他的省选停课,这次的时间很长,暂定停到一试结束,不过有机会二试的话还是可以搞到4月了 这段时间的学习就变得量大而且杂了,一般以刷薄弱的知识点和补一些新的奇怪技巧为主. ...
- 省选前的th题
沙茶博主终于整完了知识点并学完了早该在NOIP之前学的知识们 于是终于开始见题了,之前那个奇怪的题单的结果就是这个了 题目按沙茶博主的做题顺序排序 个人感觉(暂时)意义不大的已被自动忽略 洛谷 491 ...
- git-简单流程(学习笔记)
这是阅读廖雪峰的官方网站的笔记,用于自己以后回看 1.进入项目文件夹 初始化一个Git仓库,使用git init命令. 添加文件到Git仓库,分两步: 第一步,使用命令git add <file ...
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
- SQL Server技术内幕笔记合集
SQL Server技术内幕笔记合集 发这一篇文章主要是方便大家找到我的笔记入口,方便大家o(∩_∩)o Microsoft SQL Server 6.5 技术内幕 笔记http://www.cnbl ...
随机推荐
- js手机浏览器浏览WebApp弹出的键盘遮盖住文本框的解决办法
if(window.navigator.userAgent.indexOf('Android') > -1 || window.navigator.userAgent.indexOf('Adr' ...
- linux基础命令--rmdir 删除空目录
描述 rmdir命令用于删除空目录. 语法 rmdir [OPTION]... DIRECTORY... 选项列表 选项(常用的已加粗) 说明 --ignore-fail-on-non-empty 忽 ...
- nodeJs和JavaScript的异同(转)
原文:https://blog.csdn.net/lazycode_cat/article/details/61916291 JavaScript组成:ECMAScript(定义这门语言的基础,比如语 ...
- matlab工作空间数据导入simulink
使用的是其中一种方式: 第一步在工作命令区 ,写命令: 第二步:保证导入simulink区,及from worker设置: 其中注意设置你的采样时间, 第三步设置scop : 采样时承接数据线上 ...
- Warning: count(): Parameter must be an array or an object that implements Countable in line 302解决方法
ytkah在调试项目时又弹出一个警告Warning: count(): Parameter must be an array or an object that implements Countabl ...
- httpappplication 和 httpmodule 的理解(转载,写的很好)
第一部分:转载自Artech IIS与ASP.NET管道 ASP.NET管道 以IIS 6.0为例,在工作进程w3wp.exe中,利用Aspnet_ispai.dll加载.NET运行时(如果.NET ...
- test request&&response 代码实现
使用工具 IDEA 创建一个登录页面和后方数据库连接 1.编写login.html文件 导入到web文件夹下 设置配置文件 druid.properties 导入jar包 放置到web文件夹下 ...
- 00JAVA语法基础_动手动脑
1.仔细阅读示例: EnumTest.java,运行它,分析运行结果? 枚举类型的使用是借助ENUM这样一个类,这个类是JAVA枚举类型的公共基本类.枚举目的就是要让某个变量的取值只能为若干固定值中的 ...
- Jmeter笔记(Ⅲ) Jmeter的非GUI操作
在启动Jmeter时,我们会看到这样一句提示: 不要使用GUI模式(界面模式)进行负载测试,GUI模式只能用于创建测试和调试.进行负载测试时,需要时用非GUI模式. 那么为什么进行负载测试时一定要用非 ...
- 再谈javascriptjs原型与原型链及继承相关问题
什么是原型语言 只有对象,没有类;对象继承对象,而不是类继承类. “原型对象”是核心概念.原型对象是新对象的模板,它将自身的属性共享给新对象.一个对象不但可以享有自己创建时和运行时定义的属性,而且可以 ...