正题

题目链接: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\)个点是强连通分量的竞赛图个数。

那么有

\[2^{\frac{n(n-1)}2}=2\sum_{i=0}^{n-1}2^{\frac{i(i-1)}{2}}f_{n-i}\binom{n}{i}
\]

但是注意\(n=0\)的时候要特别处理算出来为\(1\)。

化一下式子有

\[2^{\frac{n(n-1)}2}=2\sum_{i=0}^{n-1}2^{\frac{i(i-1)}{2}}f_{n-i}\frac{n!}{i!(n-i)!}
\]
\[\frac{2^{\frac{n(n-1)}2}}{n!}=\sum_{i=0}^{n-1}\frac{2^{\frac{i(i-1)}{2}}}{i!}\frac{2f_{n-i}}{(n-i)!}
\]

设\(F=\sum_{i=0}^{\infty}\frac{2f_i}{i!},G=\sum_{i=0}^{\infty}\frac{2^{\frac{i(i-1)}{2}}}{i!}\),那么有

\[G=FG+1\Rightarrow F=\frac{G-1}{G}
\]

上多项式求逆就可以求出\(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,多项式求逆】的更多相关文章

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

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

  2. 【bzoj3456】城市规划 容斥原理+NTT+多项式求逆

    题目描述 求出n个点的简单(无重边无自环)无向连通图数目mod 1004535809(479 * 2 ^ 21 + 1). 输入 仅一行一个整数n(<=130000) 输出 仅一行一个整数, 为 ...

  3. NTT+多项式求逆+多项式开方(BZOJ3625)

    定义多项式$h(x)$的每一项系数$h_i$,为i在c[1]~c[n]中的出现次数. 定义多项式$f(x)$的每一项系数$f_i$,为权值为i的方案数. 通过简单的分析我们可以发现:$f(x)=\fr ...

  4. BZOJ1042 HAOI2008硬币购物(任意模数NTT+多项式求逆+生成函数/容斥原理+动态规划)

    第一眼生成函数.四个等比数列形式的多项式相乘,可以化成四个分式.其中分母部分是固定的,可以多项式求逆预处理出来.而分子部分由于项数很少,询问时2^4算一下贡献就好了.这个思路比较直观.只是常数巨大,以 ...

  5. 【BZOJ 3456】 3456: 城市规划 (NTT+多项式求逆)

    3456: 城市规划 Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 658  Solved: 364 Description 刚刚解决完电力网络的问题 ...

  6. BZOJ 4555 [Tjoi2016&Heoi2016]求和 ——分治 NTT 多项式求逆

    不想多说了,看网上的题解吧,我大概说下思路. 首先考察Stirling的意义,然后求出递推式,变成卷积的形式. 然后发现贡献是一定的,我们可以分治+NTT. 也可以直接求逆(我不会啊啊啊啊啊) #in ...

  7. BZOJ 3456 城市规划 ( NTT + 多项式求逆 )

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3456 题意: 求出\(n\)个点的简单(无重边无自环)无向连通图的个数.(\(n< ...

  8. [BZOJ3456]城市规划:DP+NTT+多项式求逆

    写在前面的话 昨天听吕老板讲课,数数题感觉十分的神仙. 于是,ErkkiErkko这个小蒟蒻也要去学数数题了. 分析 Miskcoo orz 带标号无向连通图计数. \(f(x)\)表示\(x\)个点 ...

  9. BZOJ 3625 [Codeforces Round #250]小朋友和二叉树 ——NTT 多项式求逆 多项式开根

    生成函数又有奇妙的性质. $F(x)=C(x)*F(x)*F(x)+1$ 然后大力解方程,得到一个带根号的式子. 多项式开根有解只与常数项有关. 发现两个解只有一个是成立的. 然后多项式开根.求逆. ...

随机推荐

  1. yum clean all大坑解决

    在Centos7系统中执行yum clean all 之后,发现yum的其他执行都报错了: 要解决,关键在这里: 把/var/cache/yum/ 下面的文件删除了 接下来,如果执行yum repol ...

  2. [ES6深度解析]15:模块 Module

    JavaScript项目已经发展到令人瞠目结舌的规模,社区已经开发了用于大规模工作的工具.你需要的最基本的东西之一是一个模块系统,这是一种将你的工作分散到多个文件和目录的方法--但仍然要确保你的所有代 ...

  3. Socket 网络编程和IO模型

    最近做了一个织机数据采集的服务器程序. 结构也非常简单,织机上的嵌入式设备,会通过Tcp 不停的往服务器发送一些即时数据.织机大改有个几十台到几百台不定把 刨去业务,先分析一下网络层的大概情况.每台织 ...

  4. WPF---数据绑定(二)

    一.绑定到非UI元素 上篇中,我们绑定的数据源均是派生自UIElement的WPF元素.本篇描述的绑定数据源是一个我们自定义的普通的类型. 注:尽管绑定的数据源可以是任意类型的对象,但Path必须总是 ...

  5. 深入浅出Mybatis系列(二)---Mybatis入门

    一.Mybatis环境搭建及简单实例 1. 新建web项目, 添加依赖包:mybatis包.数据库驱动包(我使用的是mysql).日志包(我使用的是log4j), 由于我的是maven项目, 那么添加 ...

  6. Flink中的算子操作

    一.Connect DataStream,DataStream ->  ConnectedStream,连接两个保持他们类型的数据流,两个数据流被Connect之后,只是被放在了同一个流中,内部 ...

  7. spring boot纯注解开发模板

    简介 spring boot纯注解开发模板 创建项目 pom.xml导入所需依赖 点击查看源码 <dependencies> <dependency> <groupId& ...

  8. HTTP系列之:HTTP中的cookies

    目录 简介 cookies的作用 创建cookies cookies的生存时间 cookies的权限控制 第三方cookies 总结 简介 如果小伙伴最近有访问国外的一些标准网站的话,可能经常会弹出一 ...

  9. linux centos7 重启后网络出现问题

    2021-08-04 重启虚拟机后发现网络出了问题,输入 ip a 查看网络,出现以下情况 查看配置文件 cat /etc/sysconfig/network-scripts/ifcfg-ens33  ...

  10. 关于ES6中Promise的应用-顺序合并Promise,并将返回结果以数组的形式输出

    1.Promise 基础知识梳理 创建一个Promise实例 const promise = new Promise(function(resolve, reject) { if (success){ ...