bzoj3456 城市规划 多项式求In
\(n\)个点的无向联通图的个数
打着好累啊
一定要封装一个板子
记\(C(x)\)为无向图个数的指数型生成函数,\(C(0) = 1\)
记\(G(x)\)为无向联通图个数的指数型生成函数,\(G(0) = 0\)
那么\(G(x) = e^{C(x)}\)
从而,\(C(x) = In(G(x))\)
复杂度\(O(n \log n)\)
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define ri register int
#define rep(io, st, ed) for(ri io = st; io <= ed; io ++)
#define drep(io, ed, st) for(ri io = ed; io >= st; io --)
const int sid = 270000;
const int mod = 1004535809;
inline int Inc(int a, int b) { return (a + b >= mod) ? a + b - mod : a + b; }
inline int Dec(int a, int b) { return (a - b < 0) ? a - b + mod : a - b; }
inline int mul(int a, int b) { return 1ll * a * b % mod; }
inline int fp(int a, int k) {
int ret = 1;
for( ; k; k >>= 1, a = mul(a, a))
if(k & 1) ret = mul(ret, a);
return ret;
}
int N_, N, n, lg;
int ans[sid], ivfac[sid], fac[sid], inv[sid], rev[sid];
inline void init(int Maxn, int &rn, int &rlg, int opt = 0) {
rn = 1; rlg = 0;
while(rn < Maxn) rn <<= 1, rlg ++;
if(opt) rep(i, 0, rn) rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << (rlg - 1));
}
inline int NTT(int *a, int n, int opt) {
for(ri i = 0; i < n; i ++)
if(i < rev[i]) swap(a[i], a[rev[i]]);
for(ri i = 1; i < n; i <<= 1)
for(ri j = 0, g = fp(3, (mod - 1) / (i << 1)); j < n; j += (i << 1))
for(ri k = j, G = 1; k < i + j; k ++, G = 1ll * G * g % mod) {
int x = a[k], y = mul(G, a[i + k]);
a[k] = (x + y >= mod) ? x + y - mod : x + y;
a[i + k] = (x - y < 0) ? x - y + mod : x - y;
}
if(opt == -1) {
reverse(a + 1, a + n);
for(ri i = 0; i < n; i ++) a[i] = mul(a[i], inv[n]);
}
}
int iva[sid], ivb[sid];
inline void get_inv(int *a, int n, int *ret) {
if(n == 1) { ret[0] = inv[a[0]]; return; }
get_inv(a, n >> 1, ret);
init(n + n, N, lg, 1);
for(ri i = 0; i < N; i ++) iva[i] = ivb[i] = 0;
for(ri i = 0; i < n; i ++) iva[i] = a[i], ivb[i] = ret[i];
NTT(iva, N, 1); NTT(ivb, N, 1);
for(ri i = 0; i < N; i ++) iva[i] = Dec(Inc(ivb[i], ivb[i]), mul(iva[i], mul(ivb[i], ivb[i])));
NTT(iva, N, -1);
for(ri i = 0; i < n; i ++) ret[i] = iva[i];
}
inline void wf(int *a, int n, int *ret) { for(ri i = 1; i < n; i ++) ret[i - 1] = mul(a[i], i); }
inline void jf(int *a, int n, int *ret) { for(ri i = 1; i < n; i ++) ret[i] = mul(a[i - 1], inv[i]); }
int ivf[sid], df[sid];
inline void get_ln(int *a, int n, int *ret) {
int N = 1, lg = 0;
init(n + n, N, lg);
wf(a, n, df); get_inv(a, n, ivf);
init(n + n, N, lg, 1);
NTT(df, N, 1); NTT(ivf, N, 1);
for(ri i = 0; i < N; i ++) df[i] = mul(df[i], ivf[i]);
NTT(df, N, -1); jf(df, n, ret);
}
int C2[sid], f[sid];
int main() {
freopen("3456.in", "r", stdin);
freopen("3456.out", "w", stdout);
cin >> n;
init(n + 5, N_, lg);
N_ <<= 1;
inv[0] = inv[1] = 1;
fac[0] = fac[1] = 1;
ivfac[0] = ivfac[1] = 1;
rep(i, 2, N_) {
fac[i] = mul(fac[i - 1], i);
inv[i] = mul(inv[mod % i], mod - mod / i);
}
rep(i, 2, N_) ivfac[i] = mul(inv[i], ivfac[i - 1]);
rep(i, 0, N_) C2[i] = 1ll * i * (i - 1) / 2 % (mod - 1);
rep(i, 0, N_) f[i] = mul(fp(2, C2[i]), ivfac[i]);
N_ >>= 1;
get_ln(f, N_, ans);
printf("%d\n", mul(ans[n], fac[n]));
return 0;
}
bzoj3456 城市规划 多项式求In的更多相关文章
- 【BZOJ3456】城市规划 多项式求逆
[BZOJ3456]城市规划 Description 刚刚解决完电力网络的问题, 阿狸又被领导的任务给难住了. 刚才说过, 阿狸的国家有n个城市, 现在国家需要在某些城市对之间建立一些贸易路线, 使得 ...
- BZOJ 3456: 城市规划 [多项式求逆元 组合数学 | 生成函数 多项式求ln]
3456: 城市规划 题意:n个点组成的无向连通图个数 以前做过,今天复习一下 令\(f[n]\)为n个点的无向连通图个数 n个点的完全图个数为\(2^{\binom{n}{2}}\) 和Bell数的 ...
- BZOJ 3456: 城市规划 [多项式求逆元 DP]
题意: 求出n个点的简单(无重边无自环)无向连通图数目.方案数mod 1004535809(479 * 2 ^ 21 + 1)即可. n<=130000 DP求方案 g(n) n个点所有图的方案 ...
- BZOJ 3456: 城市规划 多项式求逆
Description 刚刚解决完电力网络的问题, 阿狸又被领导的任务给难住了. 刚才说过, 阿狸的国家有n个城市, 现在国家需要在某些城市对之间建立一些贸易路线, 使得整个国家的任意两个城市都直接 ...
- bzoj 3456 城市规划 多项式求逆+分治FFT
城市规划 Time Limit: 40 Sec Memory Limit: 256 MBSubmit: 1091 Solved: 629[Submit][Status][Discuss] Desc ...
- bzoj3456城市规划 多项式取模
題目大意 求出有n个点的有标号简单连通无向图的数目. 题解 什么破玩意,直接输出\(2^{C_n^2}\)走人 我们发现这张图要求连通,而上式肯定不能保证连通. 其实上式表示的是不保证连通的有标号简单 ...
- [BZOJ3456]城市规划(生成函数+多项式求逆+多项式求ln)
城市规划 时间限制:40s 空间限制:256MB 题目描述 刚刚解决完电力网络的问题, 阿狸又被领导的任务给难住了. 刚才说过, 阿狸的国家有n个城市, 现在国家需要在某些城市对之间建立一 ...
- 【BZOJ3456】轩辕朗的城市规划 无向连通图计数 CDQ分治 FFT 多项式求逆 多项式ln
题解 分治FFT 设\(f_i\)为\(i\)个点组成的无向图个数,\(g_i\)为\(i\)个点组成的无向连通图个数 经过简单的推导(枚举\(1\)所在的连通块大小),有: \[ f_i=2^{\f ...
- 【bzoj3456】城市规划(多项式求逆+dp)
Description 求\(~n~\)个点组成的有标号无向连通图的个数.\(~1 \leq n \leq 13 \times 10 ^ 4~\). Solution 这道题的弱化版是poj1737, ...
随机推荐
- 南京邮电大学 CTF 逆向部分 Writeup
Hello,RE! 提示 IDA 中按 R . Google 到 IDA 中 R 快捷键是 Character ,转为字符串. 丢进 IDA(虽然我并不会使用 IDA 有个 strcmp 函数,比较 ...
- vuejs心法和技法
原文地址:http://www.cnblogs.com/kidsitcn/p/5409994.html 所有的vuejs组件都是被扩展的vue实例: var MyComponent = Vue.ext ...
- JS三种消息框的使用
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 使用RegSetValueEx修改注册表时遇到的问题(转)
原文转自 http://blog.csdn.net/tracyzhongcf/article/details/4076870 1.今天在使用RegSetValueEx时发现一个问题: RegSetVa ...
- MySQL参数设置
InnoDB配置 从MySQL 5.5版本开始,InnoDB就是默认的存储引擎并且它比任何其它存储引擎的使用要多得多.那也是为什么它需要小心配置的原因. 1 innodb_file_per_table ...
- Python-Web框架的本质
Web框架的本质 我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端. 这样我们就可以自己实现Web框架了. Python中使用socket和 ...
- RobotFramework基本用法(二)
双击打开C:\Python27\Scripts目录下的 ride.py 一,定义变量,打印 1,右键File-->New Poreject,在项目下右键New suite,在套件下右键 New ...
- vue+vuex+axios+echarts画一个动态更新的中国地图
一. 生成项目及安装插件 # 安装vue-cli npm install vue-cli -g # 初始化项目 vue init webpack china-map # 切到目录下 cd china- ...
- day07作业
import java.util.Scanner; class SsqGame { public static void main(String[] args) { int total = 0;//买 ...
- jQuery选择器详解及实例---《转载》
选择器是jQuery最基础的东西,本文中列举的选择器基本上囊括了所有的jQuery选择器,也许各位通过这篇文章能够加深对jQuery选择器的理解,它们本身用法就非常简单,我更希望的是它能够提升个人编写 ...