P4233-射命丸文的笔记【NTT,多项式求逆】
正题
题目链接:https://www.luogu.com.cn/problem/P4233
题目大意
随机选择一条有哈密顿回路的\(n\)个点的竞赛图,求选出图的哈密顿回路的期望个数。
对于每个\(n\in[1,N]\)求答案。
\(1\leq N\leq 10^5\)
解题思路
竟然自己推出来了泪目( Ĭ ^ Ĭ )
如果是统计所以的哈密顿回路个数是一个很简单的题目,我们可以求出\(n\)的一个圆排列表示一条回路,然后剩下的边随便排即可。也就是\((n-1)!\times 2^{\frac{n(n-1)}{2}-n}\)条哈密顿路,但是因为求的是期望所以我们还得求出有哈密顿回路的竞赛图个数,然后有一个结论就是如果一个竞赛图是一个强连通分量那么这个图就一定存在哈密顿回路。
这个是问题所在,我们可以考虑用城市规划的推法,设\(f_i\)表示\(i\)个点是强连通分量的竞赛图个数。
那么有
\]
但是注意\(n=0\)的时候要特别处理算出来为\(1\)。
化一下式子有
\]
\]
设\(F=\sum_{i=0}^{\infty}\frac{2f_i}{i!},G=\sum_{i=0}^{\infty}\frac{2^{\frac{i(i-1)}{2}}}{i!}\),那么有
\]
上多项式求逆就可以求出\(f\)了。
时间复杂度\(O(n\log n)\)
code
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=131072,M=N<<1,P=998244353;
ll n,fac[M],G[M],H[M],r[M],tmp[M];
ll power(ll x,ll b){
ll ans=1;
while(b){
if(b&1)ans=ans*x%P;
x=x*x%P;b>>=1;
}
return ans;
}
void NTT(ll *f,ll n,ll op){
for(ll i=0;i<n;i++)
if(i<r[i])swap(f[i],f[r[i]]);
for(ll p=2;p<=n;p<<=1){
ll len=(p>>1),tmp=power(3,(P-1)/p);
if(op==-1)tmp=power(tmp,P-2);
for(ll k=0;k<n;k+=p){
ll buf=1;
for(ll i=k;i<k+len;i++){
ll tt=buf*f[i+len]%P;
f[i+len]=(f[i]-tt+P)%P;
f[i]=(f[i]+tt)%P;
buf=buf*tmp%P;
}
}
}
if(op==-1){
ll invn=power(n,P-2);
for(ll i=0;i<n;i++)
f[i]=f[i]*invn%P;
}
return;
}
void GetInv(ll n,ll *f,ll *g){
if(!n)
{g[0]=power(f[0],P-2);return;}
GetInv(n>>1,f,g);ll m=n<<1;
for(ll i=0;i<n;i++)tmp[i]=f[i];
for(ll i=0;i<m;i++)r[i]=(r[i>>1]>>1)|((i&1)?(m>>1):0);
NTT(tmp,m,1);NTT(g,m,1);
for(ll i=0;i<m;i++)
g[i]=(2*g[i]-tmp[i]*g[i]%P*g[i]%P+P)%P;
NTT(g,m,-1);
for(ll i=n;i<m;i++)g[i]=0;
return;
}
signed main()
{
scanf("%lld",&n);fac[0]=1;
for(ll i=1;i<N;i++)fac[i]=fac[i-1]*i%P;
for(ll i=0;i<N;i++)G[i]=power(2,i*(i-1)/2ll)*power(fac[i],P-2)%P;
GetInv(N,G,H);G[0]--;
NTT(G,M,1);NTT(H,M,1);
for(ll i=0;i<M;i++)G[i]=G[i]*H[i]%P;
NTT(G,M,-1);
for(ll i=1;i<=n;i++){
if(i==1){puts("1");continue;}
G[i]=G[i]*fac[i]%P;
if(!G[i]){puts("-1");continue;}
ll ans=fac[i-1]*power(2,i*(i-1)/2ll-i)%P;
printf("%d\n",ans*power(G[i],P-2)%P);
}
return 0;
}
P4233-射命丸文的笔记【NTT,多项式求逆】的更多相关文章
- 洛谷P4233 射命丸文的笔记 【多项式求逆】
题目链接 洛谷P4233 题解 我们只需求出总的哈密顿回路个数和总的强联通竞赛图个数 对于每条哈密顿回路,我们统计其贡献 一条哈密顿回路就是一个圆排列,有\(\frac{n!}{n}\)种,剩余边随便 ...
- 【bzoj3456】城市规划 容斥原理+NTT+多项式求逆
题目描述 求出n个点的简单(无重边无自环)无向连通图数目mod 1004535809(479 * 2 ^ 21 + 1). 输入 仅一行一个整数n(<=130000) 输出 仅一行一个整数, 为 ...
- NTT+多项式求逆+多项式开方(BZOJ3625)
定义多项式$h(x)$的每一项系数$h_i$,为i在c[1]~c[n]中的出现次数. 定义多项式$f(x)$的每一项系数$f_i$,为权值为i的方案数. 通过简单的分析我们可以发现:$f(x)=\fr ...
- BZOJ1042 HAOI2008硬币购物(任意模数NTT+多项式求逆+生成函数/容斥原理+动态规划)
第一眼生成函数.四个等比数列形式的多项式相乘,可以化成四个分式.其中分母部分是固定的,可以多项式求逆预处理出来.而分子部分由于项数很少,询问时2^4算一下贡献就好了.这个思路比较直观.只是常数巨大,以 ...
- 【BZOJ 3456】 3456: 城市规划 (NTT+多项式求逆)
3456: 城市规划 Time Limit: 40 Sec Memory Limit: 256 MBSubmit: 658 Solved: 364 Description 刚刚解决完电力网络的问题 ...
- BZOJ 4555 [Tjoi2016&Heoi2016]求和 ——分治 NTT 多项式求逆
不想多说了,看网上的题解吧,我大概说下思路. 首先考察Stirling的意义,然后求出递推式,变成卷积的形式. 然后发现贡献是一定的,我们可以分治+NTT. 也可以直接求逆(我不会啊啊啊啊啊) #in ...
- BZOJ 3456 城市规划 ( NTT + 多项式求逆 )
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3456 题意: 求出\(n\)个点的简单(无重边无自环)无向连通图的个数.(\(n< ...
- [BZOJ3456]城市规划:DP+NTT+多项式求逆
写在前面的话 昨天听吕老板讲课,数数题感觉十分的神仙. 于是,ErkkiErkko这个小蒟蒻也要去学数数题了. 分析 Miskcoo orz 带标号无向连通图计数. \(f(x)\)表示\(x\)个点 ...
- BZOJ 3625 [Codeforces Round #250]小朋友和二叉树 ——NTT 多项式求逆 多项式开根
生成函数又有奇妙的性质. $F(x)=C(x)*F(x)*F(x)+1$ 然后大力解方程,得到一个带根号的式子. 多项式开根有解只与常数项有关. 发现两个解只有一个是成立的. 然后多项式开根.求逆. ...
随机推荐
- qt 中的对象树
本节内容讲解了什么是对象树以及其所带来的 GUI 编程好处.最后说明了在对象树中析构顺序问题并举了个特殊的例子,来说明平时编程中需要注意的一个点. 什么是对象树? 我们常常听到 QObject 会用对 ...
- 同步(synchronized)
转载至:https://www.cnblogs.com/dolphin0520/p/3923737.html 一.什么时候会出现线程安全问题? 在单线程中不会出现线程安全问题,而在多线程编程中,有可能 ...
- redis并发锁
1.应对并发场景 避免操作数据不一致 将对redis加锁 2.考虑到异常状况无法释放锁,导致死锁 将代码块进行try-catch处理 3.考虑try时宕机依然导致死锁 对锁添加时效性,添加过期时间 4 ...
- SpringBoot快速搭建流程
创建一个新项目 使用maven创建一个新项目 给定项目名称.finsh完成创建 跑起来SpringBoot 引入依赖parent > SpringBoot父级依赖,spring-boot-sta ...
- Inject-APC(Ring0)
1 #include "stdafx.h" 2 #include <iostream> 3 #include <Windows.h> 4 #include ...
- python十行代码实现文件去重,去除重复文件的脚本
导入依赖 '''导入依赖''' from pathlib import Path import filecmp 函数说明 ''' filecmp.cmp(path1, path2, shallow=T ...
- etcd学习(7)-etcd中的线性一致性实现
线性一致性 CAP 什么是CAP CAP的权衡 AP wihtout C CA without P CP without A 线性一致性 etcd中如何实现线性一致性 线性一致性写 线性一致性读 1. ...
- go逃逸分析
目录 1. 前言 2. 逃逸策略 3. 逃逸场景 3.1 指针逃逸 3.2 栈空间不足逃逸 3.3 动态类型逃逸 3.4 闭包引用对象逃逸 4 逃逸总结 5. 注意事项 1. 前言 所谓的逃逸分析(E ...
- 简单三分钟,本地搭建 k8s
使用 minikube 在本地搭建 k8s 已经比以前要简单很多了.本文,我们通过简短的三分钟来重现一下在本地搭建 k8s 实验环境的步骤. Newbe.Claptrap 是一个用于轻松应对并发问题的 ...
- Python之win32模块
如果想在Windows操作系统上使用Python去做一些自动化工作,pywin32模块常常会被用到,它方便了我们调用Windows API. 安装及使用 通过命令pip install pywin32 ...