正题

题目链接:https://www.luogu.com.cn/problem/P4233


题目大意

随机选择一条有哈密顿回路的nnn个点的竞赛图,求选出图的哈密顿回路的期望个数。

对于每个n∈[1,N]n\in[1,N]n∈[1,N]求答案。

1≤N≤1051\leq N\leq 10^51≤N≤105


解题思路

竟然自己推出来了泪目( Ĭ ^ Ĭ )

如果是统计所以的哈密顿回路个数是一个很简单的题目,我们可以求出nnn的一个圆排列表示一条回路,然后剩下的边随便排即可。也就是(n−1)!×2n(n−1)2−n(n-1)!\times 2^{\frac{n(n-1)}{2}-n}(n−1)!×22n(n−1)​−n条哈密顿路,但是因为求的是期望所以我们还得求出有哈密顿回路的竞赛图个数,然后有一个结论就是如果一个竞赛图是一个强连通分量那么这个图就一定存在哈密顿回路。

这个是问题所在,我们可以考虑用城市规划的推法,设fif_ifi​表示iii个点是强连通分量的竞赛图个数。
那么有
2n(n−1)2=2∑i=0n−12i(i−1)2fn−i(ni)2^{\frac{n(n-1)}2}=2\sum_{i=0}^{n-1}2^{\frac{i(i-1)}{2}}f_{n-i}\binom{n}{i}22n(n−1)​=2i=0∑n−1​22i(i−1)​fn−i​(in​)
但是注意n=0n=0n=0的时候要特别处理算出来为111。

化一下式子有
2n(n−1)2=2∑i=0n−12i(i−1)2fn−in!i!(n−i)!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)!}22n(n−1)​=2i=0∑n−1​22i(i−1)​fn−i​i!(n−i)!n!​
2n(n−1)2n!=∑i=0n−12i(i−1)2i!2fn−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)!}n!22n(n−1)​​=i=0∑n−1​i!22i(i−1)​​(n−i)!2fn−i​​
设F=∑i=0∞2fii!,G=∑i=0∞2i(i−1)2i!F=\sum_{i=0}^{\infty}\frac{2f_i}{i!},G=\sum_{i=0}^{\infty}\frac{2^{\frac{i(i-1)}{2}}}{i!}F=∑i=0∞​i!2fi​​,G=∑i=0∞​i!22i(i−1)​​,那么有
G=FG+1⇒F=G−1GG=FG+1\Rightarrow F=\frac{G-1}{G}G=FG+1⇒F=GG−1​

上多项式求逆就可以求出fff了。

时间复杂度O(nlog⁡n)O(n\log n)O(nlogn)


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. 「Luogu4233」射命丸文的笔记-生成函数+多项式求逆

    Description 链接 Solution 考虑所有竞赛图的哈密顿回路条数n!n2Cn2−n\frac {n!} {n} 2^{C_{n}^{2}-n}nn!​2Cn2​−n,即选出一条哈密顿回路 ...

  3. P4841,jzoj3303-城市规划【NTT,多项式求逆,dp】

    正题 题目链接:https://www.luogu.org/problemnew/show/P4841 题目大意 求nnn个点的简单联通无向图的个数. 解题思路 首先考虑n2n^2n2,我们设gig_ ...

  4. bzoj 3456: 城市规划【NTT+多项式求逆】

    参考:http://blog.miskcoo.com/2015/05/bzoj-3456 首先推出递推式(上面的blog讲的挺清楚的),大概过程是正难则反,设g为n个点的简单(无重边无自环)无向图数目 ...

  5. 洛谷 P4233 射命丸文的笔记 ntt

    题目背景 (七)再见,地底世界的朋友们 在地灵殿住了许多天了呢. 这些日子里,觉分享了很多旧地狱的故事. 此次地底旅行,可以说是非常充实了. 虽然仍旧有些不舍,不过人类总是要见太阳的,再说这样麻烦觉姐 ...

  6. Luogu4725 【模板】多项式对数函数(NTT+多项式求逆)

    https://www.cnblogs.com/HocRiser/p/8207295.html 安利! #include<iostream> #include<cstdio> ...

  7. 多项式算法5:多项式求逆

    多项式算法5:多项式求逆 多项式求逆 前置知识: FFT NTT 多项式求逆 这里的多项式求逆,其实是求多项式的逆元. 对于多项式A(x)A(x)A(x),如果存在A(x)B(x)≡1(modxn)A ...

  8. 【洛谷P4233】— 射命丸文的笔记(竞赛图+多项式求逆)

    传送门 考虑强连通竞赛图哈密顿回路总数很好求 为(n−1)!2(n2)−n(n-1)!2^{{n\choose 2}-n}(n−1)!2(2n​)−n 现在问题是求强连通竞赛图数 设fif_ifi​为 ...

  9. 【LuoguP4233】射命丸文的笔记-多项式求逆

    测试地址:射命丸文的笔记 做法:本题需要用到多项式求逆. 首先,要求存在哈密顿回路的竞赛图的哈密顿回路期望数量,就是用哈密顿回路的总数除以存在哈密顿回路的竞赛图数量. 要考虑所有竞赛图的哈密顿回路数量 ...

最新文章

  1. 多线程threading
  2. HttpHandler动态生成图片
  3. SAP ABAP关键字在Chrome浏览器里高亮显示的实现原理 - How is ABAP keyword highlight implemented in Chrome
  4. 团队二阶段冲刺个人工作总结2
  5. 2021年中国数字化采购研究报告
  6. 如何在文件夹中创建nodeJs项目
  7. hive单机安装 beeline连接hive无法连接
  8. 用“混序”替代鲍尔默
  9. Egret Native项目热更新
  10. oralce入门学习
  11. 黑马程序员Java教程学习笔记(一)
  12. 在CentOS8.3上安装Vlmcsd-1113搭建Kms服务
  13. Direct3D9初始化-------VB6编程学习DX9游戏编程DirectX9编程2D小游戏源码冷风引擎CoolWind2D游戏引擎(6)
  14. MySQL8.0备份与还原工具讲解----mysqlbackup篇
  15. 大二java基础期末考试试题,保准看明白!
  16. linux下使用VSCode的C++添加json问题。
  17. PAT 1009 蜜蜂寻路
  18. VMware Workstation 15界面,英文改中文
  19. 【计算机毕业设计】视频教学管理系统
  20. 打印一只Nyan Cat(彩虹猫)(C++)3.0[多色版]

热门文章

  1. react dispatch_React测试的那些事(三) React Hook 测试实例
  2. 兔子野鸡49只100条腿c语言,家禽生产学复习题
  3. 扩展mysql_扩展mysql - 手把手教你写udf
  4. 判断小数是否相等_五年级上册数学综合练习题(填空、判断、选择、文字题),覆盖全册知识点!...
  5. html语言可以写模版继承吗,Django框架(十一):模板介绍、模板语言、模板继承、HTML转义...
  6. php类的的属性值,PHP面向对象之旅:类的属性
  7. matlab 如何画二维图形,Matlab 学习 画图篇 一 二维图形
  8. HTML阅读位置,script在HTML文档中位置
  9. java编程_Java编程和C语言的比较
  10. 利用数组创建二叉树并赋值