「Luogu4233」射命丸文的笔记-生成函数+多项式求逆
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−1Cnif(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」射命丸文的笔记-生成函数+多项式求逆相关推荐
- 洛谷P4233 射命丸文的笔记 【多项式求逆】
题目链接 洛谷P4233 题解 我们只需求出总的哈密顿回路个数和总的强联通竞赛图个数 对于每条哈密顿回路,我们统计其贡献 一条哈密顿回路就是一个圆排列,有\(\frac{n!}{n}\)种,剩余边随便 ...
- (每日一题)P4841 [集训队作业2013]城市规划 (无向连通图计数)(普通生成函数 + 多项式求逆)
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 每日一题(莫反 / 多项式 / 母函数 / 群论) 2021.4.14 生成函数 + 多项式求逆 Pr ...
- CF438E The Child and Binary Tree(有意思的生成函数 + 多项式求逆 + 多项式开方)
整理的算法模板合集: ACM模板 点我看多项式全家桶(●^◡_◡◡^●) CF438E The Child and Binary Tree 简单的黑题 首先我们发现模数为99824435399824 ...
- 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∑na[i] ...
- 【LuoguP4233】射命丸文的笔记-多项式求逆
测试地址:射命丸文的笔记 做法:本题需要用到多项式求逆. 首先,要求存在哈密顿回路的竞赛图的哈密顿回路期望数量,就是用哈密顿回路的总数除以存在哈密顿回路的竞赛图数量. 要考虑所有竞赛图的哈密顿回路数量 ...
- 【洛谷P4233】— 射命丸文的笔记(竞赛图+多项式求逆)
传送门 考虑强连通竞赛图哈密顿回路总数很好求 为(n−1)!2(n2)−n(n-1)!2^{{n\choose 2}-n}(n−1)!2(2n)−n 现在问题是求强连通竞赛图数 设fif_ifi为 ...
- 【学习笔记】超简单的多项式求逆(含全套证明)
整理的算法模板合集: ACM模板 目录 多项式求逆 一.分治FFT 二.倍增法及其证明 三.多项式求逆例题 P4238 [模板]多项式乘法逆 点我看多项式全家桶(●^◡_◡◡^●) 多项式求逆 一. ...
- #3456. 城市规划(生成函数,多项式求逆)
#3456. 城市规划 设fnf_nfn为nnn个点的的点的简单无向连通图数目,gng_ngn为nnn个点的简单无向图个数(不要求联通). 对于gng_ngn显然有gn=2n(n−1)2g_n ...
- P4233-射命丸文的笔记【NTT,多项式求逆】
正题 题目链接:https://www.luogu.com.cn/problem/P4233 题目大意 随机选择一条有哈密顿回路的nnn个点的竞赛图,求选出图的哈密顿回路的期望个数. 对于每个n∈[1 ...
最新文章
- 猜数字游戏:随机键盘录入一个数字,看是否能猜正确
- MTK Android添加驱动模块
- 排序算法:桶排序、计数排序、基数排序
- 130 道 K8s + Docker + DevOps 大厂面试题及知识点详解
- 使用OpenCV python模块读取图像并将其另存为灰度系统
- 云在物联网中的惊人优势 | 技术头条
- lpv4的地址格式由多少个字节组成_我们为什么有这么多字符编码格式?
- [蓝桥杯]2018年第九届省赛真题C/C++ B组 填空+大题
- php安装sqlserver2008,php53 mssql2008_sqlserver2008安装环境_php mssql库
- 游戏需求,猎豹启发!揭秘华为Mate 20 X石墨烯膜散热方案出台始末
- 华信mysql数据恢复_华信Mysql数据库修复工具1.0
- 编程之美之寻找发帖“水王” 的算法问题
- 一张图理清SpringMVC工作原理
- 94 - 绘制谢尔宾斯基三角形
- 互联网晚报 | 12月9日 星期四 | 微博正式登陆港交所;OPPO官宣首款自研芯片即将发布;腾讯启动“技术公益创投计划”...
- 大批量查询京东快递物流,并分析到站延误
- elment中走马灯与满屏图片实现
- github访问不进去,浏览器证书不安全,访问失败,证书失效,证书颁发者为VMware,谷歌浏览器小bug
- 小程序系统API调用
- 微信大量下架数字藏品相关小程序:NFT产品究竟是未来还是陷阱?
热门文章
- ooXMLAgile Encryption(一)文档结构
- 数据分析36计(22):分析师入门常见错误 幸存者偏差,如何用匹配和加权法规避...
- 用 Ruby on Rails 实现适应各种平台的在线 Office 文档预览
- python爬虫:新手爬取NASA每日精选图片
- 各种插画人物表情画法教程,绘制商业插画人物表情
- Oracle - Spool导出数据到TXT文件
- 【在ubantu20.04上安装google chrome】
- 离线地图开发下实现GPS定位,坐标纠偏回放,偏离路线
- 科大讯飞离线命令词识别
- JEECG3.3.0 配置大鱼短信