Description

链接

Solution

考虑所有竞赛图的哈密顿回路条数n!n2Cn2−n\frac {n!} {n} 2^{C_{n}^{2}-n}nn!​2Cn2​−n,即选出一条哈密顿回路剩下的边任意连。

但题目中所求的是有哈密顿回路条数的竞赛图,即强联通的竞赛图。

设f(n)f(n)f(n)表示点数为nnn的强联通竞赛图数量。g(n)g(n)g(n)表示点数为nnn的竞赛图数量。得到

f(n)=g(n)−∑i=1n−1Cnif(i)g(n−i)f(n)=g(n)-\sum_{i=1}^{n-1}C_{n}^if(i)g(n-i)f(n)=g(n)−i=1∑n−1​Cni​f(i)g(n−i)

即枚举拓扑序最小的联通块,这部分没有出边,剩下的任意连边。

设F(i)F(i)F(i)为f(i)i!\frac {f(i)} {i!}i!f(i)​的生成函数,G(i)G(i)G(i)为g(i)i!\frac {g(i)} {i!}i!g(i)​的生成函数,拆开组合数化解后

F(x)=G(x)G(x)+1F(x)=\frac {G(x)} {G(x)+1}F(x)=G(x)+1G(x)​

多项式求逆即可。

#include <bits/stdc++.h>
using namespace std;typedef long long lint;
const int mod = 998244353;
const int maxn = 500005;int m, n;
int fac[maxn], ifac[maxn], G[maxn], H[maxn], F[maxn];inline int Pow(int x, int k)
{int res = 1;while (k) {if (k & 1) res = (lint)res * x % mod;x = (lint)x * x % mod; k >>= 1;}return res;
}inline int gi()
{char c = getchar();while (c < '0' || c > '9') c = getchar();int sum = 0;while ('0' <= c && c <= '9') sum = sum * 10 + c - 48, c = getchar();return sum;
}namespace poly
{const int phi = mod - 1, G = 3;int n, len, L, R[maxn], A[maxn], B[maxn];void NTT(int *a, int f){for (int i = 0; i < n; ++i) if (i < R[i]) swap(a[i], a[R[i]]);for (int i = 1; i < n; i <<= 1) {int wn = Pow(G, phi / (i << 1)), t;if (f == -1) wn = Pow(wn, mod - 2);for (int j = 0; j < n; j += (i << 1)) {int w = 1;for (int k = 0; k < i; ++k, w = (lint)w * wn % mod) {t = (lint)a[j + i + k] * w % mod;a[j + i + k] = a[j + k] - t;if (a[j + i + k] < 0) a[j + i + k] += mod;a[j + k] = a[j + k] + t;if (a[j + k] >= mod) a[j + k] -= mod;}}}}void mul(int *a, int *b, int len1, int len2, int *c, int len3){for (L = 0, n = 1, len = len1 + len2 - 1; n < len; n <<= 1) ++L;for (int i = 0; i < n; ++i) R[i] = (R[i >> 1] >> 1) | ((i & 1) << (L - 1));fill(A, A + n, 0); fill(B, B + n, 0);for (int i = 0; i < len1; ++i) A[i] = a[i];for (int i = 0; i < len2; ++i) B[i] = b[i];NTT(A, 1); NTT(B, 1);for (int i = 0; i < n; ++i) A[i] = (lint)A[i] * B[i] % mod;NTT(A, -1);int inv = Pow(n, mod - 2);for (int i = 0; i < len3; ++i) c[i] = (lint)A[i] * inv % mod;}void mul(int *a, int *b, int len1, int *c, int len2){for (L = 0, n = 1, len = len1 + len1 - 1; n < len; n <<= 1) ++L;for (int i = 0; i < n; ++i) R[i] = (R[i >> 1] >> 1) | ((i & 1) << (L - 1));fill(A, A + n, 0); fill(B, B + n, 0);for (int i = 0; i < len1; ++i) A[i] = a[i];for (int i = 0; i < len2; ++i) B[i] = b[i];NTT(A, 1); NTT(B, 1);for (int i = 0; i < n; ++i) A[i] = (lint)A[i] * B[i] % mod * B[i] % mod;NTT(A, -1);int inv = Pow(n, mod - 2);for (int i = 0; i < len2; ++i) c[i] = (lint)A[i] * inv % mod;}void poly_inv(int *a, int n, int *b){static int c[maxn];b[0] = Pow(a[0], mod - 2);for (int t = 2; (t >> 1) < n; t <<= 1) {for (int i = 0; i < t; ++i) c[i] = b[i];mul(a, b, t, b, t);for (int i = 0; i < t; ++i) b[i] = ((c[i] << 1ll) - b[i] + mod) % mod;fill(c, c + t, 0);}}}int main()
{m = gi();for (n = 1; n <= m; n <<= 1) ;fac[0] = ifac[0] = ifac[1] = 1;for (int i = 2; i < n; ++i) ifac[i] = (lint)(mod - mod / i) * ifac[mod % i] % mod;for (int i = 2; i < n; ++i) ifac[i] = (lint)ifac[i - 1] * ifac[i] % mod;for (int i = 1; i < n; ++i) fac[i] = (lint)fac[i - 1] * i % mod;for (int i = 1; i < n; ++i) G[i] = H[i] = (lint)Pow(2, ((lint)i * (i - 1) / 2) % (mod - 1)) * ifac[i] % mod;++H[0];poly::poly_inv(H, n, F);poly::mul(G, F, n, n, F, n);for (int ans, i = 1; i <= m; ++i) {if (i == 2) {puts("-1"); continue;}F[i] = (lint)F[i] * fac[i] % mod;ans = (lint)fac[i - 1] * Pow(2, max(0ll, ((lint)i * (i - 1) / 2 - i)) % (mod - 1)) % mod * Pow(F[i], mod - 2) % mod;printf("%d\n", ans);}return 0;
}

「Luogu4233」射命丸文的笔记-生成函数+多项式求逆相关推荐

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

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

  2. (每日一题)P4841 [集训队作业2013]城市规划 (无向连通图计数)(普通生成函数 + 多项式求逆)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 每日一题(莫反 / 多项式 / 母函数 / 群论) 2021.4.14 生成函数 + 多项式求逆 Pr ...

  3. CF438E The Child and Binary Tree(有意思的生成函数 + 多项式求逆 + 多项式开方)

    整理的算法模板合集: ACM模板 点我看多项式全家桶(●^◡_◡◡​^●) CF438E The Child and Binary Tree 简单的黑题 首先我们发现模数为99824435399824 ...

  4. HDU 5730 Shell Necklace(生成函数 多项式求逆)

    Shell Necklace 由题意可得f[n]=∑i=1na[i]f[n−i]f[n] = \sum\limits_{i = 1} ^{n} a[i] f[n - i]f[n]=i=1∑n​a[i] ...

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

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

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

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

  7. 【学习笔记】超简单的多项式求逆(含全套证明)

    整理的算法模板合集: ACM模板 目录 多项式求逆 一.分治FFT 二.倍增法及其证明 三.多项式求逆例题 P4238 [模板]多项式乘法逆 点我看多项式全家桶(●^◡_◡◡​^●) 多项式求逆 一. ...

  8. #3456. 城市规划(生成函数,多项式求逆)

    #3456. 城市规划 设fnf_nfn​为nnn个点的的点的简单无向连通图数目,gng_ngn​为nnn个点的简单无向图个数(不要求联通). 对于gng_ngn​显然有gn=2n(n−1)2g_n ...

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

    正题 题目链接:https://www.luogu.com.cn/problem/P4233 题目大意 随机选择一条有哈密顿回路的nnn个点的竞赛图,求选出图的哈密顿回路的期望个数. 对于每个n∈[1 ...

最新文章

  1. 猜数字游戏:随机键盘录入一个数字,看是否能猜正确
  2. MTK Android添加驱动模块
  3. 排序算法:桶排序、计数排序、基数排序
  4. 130 道 K8s + Docker + DevOps 大厂面试题及知识点详解
  5. 使用OpenCV python模块读取图像并将其另存为灰度系统
  6. 云在物联网中的惊人优势 | 技术头条
  7. lpv4的地址格式由多少个字节组成_我们为什么有这么多字符编码格式?
  8. [蓝桥杯]2018年第九届省赛真题C/C++ B组 填空+大题
  9. php安装sqlserver2008,php53 mssql2008_sqlserver2008安装环境_php mssql库
  10. 游戏需求,猎豹启发!揭秘华为Mate 20 X石墨烯膜散热方案出台始末
  11. 华信mysql数据恢复_华信Mysql数据库修复工具1.0
  12. 编程之美之寻找发帖“水王” 的算法问题
  13. 一张图理清SpringMVC工作原理
  14. 94 - 绘制谢尔宾斯基三角形
  15. 互联网晚报 | 12月9日 星期四 | 微博正式登陆港交所;OPPO官宣首款自研芯片即将发布;腾讯启动“技术公益创投计划”...
  16. 大批量查询京东快递物流,并分析到站延误
  17. elment中走马灯与满屏图片实现
  18. github访问不进去,浏览器证书不安全,访问失败,证书失效,证书颁发者为VMware,谷歌浏览器小bug
  19. 小程序系统API调用
  20. 微信大量下架数字藏品相关小程序:NFT产品究竟是未来还是陷阱?

热门文章

  1. ooXMLAgile Encryption(一)文档结构
  2. 数据分析36计(22):分析师入门常见错误 幸存者偏差,如何用匹配和加权法规避...
  3. 用 Ruby on Rails 实现适应各种平台的在线 Office 文档预览
  4. python爬虫:新手爬取NASA每日精选图片
  5. 各种插画人物表情画法教程,绘制商业插画人物表情
  6. Oracle - Spool导出数据到TXT文件
  7. 【在ubantu20.04上安装google chrome】
  8. 离线地图开发下实现GPS定位,坐标纠偏回放,偏离路线
  9. 科大讯飞离线命令词识别
  10. JEECG3.3.0 配置大鱼短信