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$ 然后大力解方程,得到一个带根号的式子. 多项式开根有解只与常数项有关. 发现两个解只有一个是成立的. 然后多项式开根.求逆. ...
随机推荐
- MYSQL数据库查询索引
1.查看数据库所有索引 SELECT * FROM mysql.`innodb_index_stats` a WHERE a.`database_name` = '数据库名'; 2.查看某一表索引 S ...
- Spring boot集成Redis实现sessions共享时,sessions过期时间问题分析
Springboot鼓励零配置的方式,帮你做好大部分重复劳动的事,好到不能再好:具体的Redis安装方法和Springboot集成Redis方法,可以去搜索相关文章或参考该文章http://www.c ...
- OAuth2 与OpenID的区别
OAuth2 OpenId OpenId是在OAuth2基础之上实现的 比OAuth2更简便 OAuth2需要在认证后 额外的去再调用用户信息的接口 才能获取用户信息 而OpenId直接伴随token ...
- (5)air202读取串口数据并上传到阿里云显示
一.首先进行云端设置 根据串口助手显示的信息,以及模块文档说明我们可以知道 其中red和ir是红光LED的原始数据, HR表示心率值, HRvalid是心率是否有效标识, SP02是血氧数值,,SPO ...
- Kickstart部署之FTP架构
原文转自:https://www.cnblogs.com/itzgr/p/10029551.html作者:木二 目录 一 准备 1.1 完整架构:Kickstart+DHCP+VSFTP+TFTP+P ...
- centos7 权限更改,所属用户及用户组更改
2021-08-03 # 查看文件的权限 ll 第一个字符, "-" 表示是文件, "d" 表示是目录(directory) 后面 9 个字符每 3 个字符又作 ...
- Appium自动化(11) - 详解 Applications 类里的方法和源码解析
如果你还想从头学起Appium,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1693896.html 前言 Applications 类 ...
- 痞子衡嵌入式:在MDK开发环境下将关键函数重定向到RAM中执行的几种方法
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是在MDK开发环境下将关键函数重定向到RAM中执行的几种方法. 这个关键函数重定向到 RAM 中执行系列文章,痞子衡已经写过 <IA ...
- Intel® QAT加速卡之Linux上编程说明
QAT Software for Linux 1. Introduction 该程序员指南提供了有关软件体系结构和使用指南的信息. 相关的英特尔QAT软件库文档中记录了有关使用英特尔QuickAssi ...
- CSS001. 纯CSS实现瀑布流(纵向排序)
通过 Multi-columns 相关的属性 column-count.column-gap 配合 break-inside 来实现瀑布流布局. 首先对包裹图片的盒子增加样式,column-count ...