题目大意:求$n$个点的带标号的无向连通图的个数

题解:令$F(x)$为带标号无向连通图个数生成函数,$G(x)$为带标号无向图个数生成函数

那么$G(x) = \sum_{i=0}^{\infty} \dfrac{2^{i(i-1)/2}}{i!} x^i$

枚举连通块个数可得$G(x)=\sum_{i=0}^{\infty}\dfrac{F^i(x)}{i!}$
$$
f(x)=f(x_0)+\dfrac{f'(x_0)(x-x_0)}{1!}+\dfrac{f''(x_0)(x-x_0)^2}{2!}+\cdots+\dfrac{f^{(n)}(x_0)(x-x_0)^n}{n!}\\
f(x)=e^x, x_0=0\\
e^x=\sum\limits_{i=0}^{\infty}\dfrac{x^i}{i!}
$$

由泰勒展开得$G(x)=e^{F(x)}$

所以$F(x) = \ln G(x)$

$$
F(x)=\ln G(x)\\
F'(x)=\dfrac{G'(x)}{G(x)}\\
F(x)=\int\dfrac{G'(x)}{G(x)}\mathrm{dx}
$$

答案是$[x^n]F(x) \times n!$

卡点:

C++ Code:

#include <cstdio>
#include <algorithm>
#define maxn 262144 + 10
const int mod = 1004535809, G = 3;
int n;
int g[maxn], f[maxn], fac[maxn], inv[maxn];
inline int pw(int base, long long p) {
p %= mod - 1, base %= mod;
int res = 1;
for (; p; p >>= 1, base = 1ll * base * base % mod) if (p & 1) res = 1ll * res * base % mod;
return res;
}
inline int INV(int x) {
return pw(x, mod - 2);
}
namespace Polynomial {
int lim, ilim, s, rev[maxn];
int C[maxn], Wn[maxn];
inline void init(int n) {
s = -1, lim = 1; while (lim < n) lim <<= 1, s++;
ilim = ::INV(lim);
for (int i = 1; i < lim; i++) rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << s);
int tmp = pw(G, (mod - 1) / lim);
Wn[0] = 1; for (int i = 1; i <= lim; i++) Wn[i] = 1ll * Wn[i - 1] * tmp % mod;
}
inline void up(int &a, int b) {if ((a += b) >= mod) a -= mod;}
inline void NTT(int *A, int op) {
for (int i = 0; i < lim; i++) if (i < rev[i]) std::swap(A[i], A[rev[i]]);
for (int mid = 1; mid < lim; mid <<= 1) {
int t = lim / mid >> 1;
for (int i = 0; i < lim; i += (mid << 1)) {
for (int j = 0; j < mid; j++) {
int W = op ? Wn[t * j] : Wn[lim - t * j];
int X = A[i + j], Y = 1ll * W * A[i + j + mid] % mod;
up(A[i + j], Y), up(A[i + j + mid] = X, mod - Y);
}
}
}
if (!op) for (int i = 0; i < lim; i++) A[i] = 1ll * A[i] * ilim % mod;
}
void INV(int *A, int *B, int n) {
if (n == 1) {B[0] = ::INV(A[0]); return ;}
INV(A, B, n + 1 >> 1), init(n << 1);
for (int i = 0; i < n; i++) C[i] = A[i];
for (int i = n; i < lim; i++) C[i] = B[i] = 0;
NTT(B, 1), NTT(C, 1);
for (int i = 0; i < lim; i++) B[i] = (2 + mod - 1ll * B[i] * C[i] % mod) * B[i] % mod;
NTT(B, 0);
for (int i = n; i < lim; i++) B[i] = 0;
}
inline void DER(int *A, int *B, int n) {
B[n] = 0; for (int i = 1; i < n; i++) B[i - 1] = 1ll * A[i] * i % mod;
}
inline void INT(int *A, int *B, int n) {
B[0] = 0; for (int i = 1; i < n; i++) B[i] = 1ll * A[i - 1] * ::INV(i) % mod;
} int D[maxn];
inline void LN(int *A, int *B, int len) {
DER(A, B, len);
INV(A, D, len);
init(n << 1);
NTT(B, 1), NTT(D, 1);
for (int i = 0; i < lim; i++) D[i] = 1ll * B[i] * D[i] % mod;
NTT(D, 0);
INT(D, B, len);
for (int i = len; i < lim; i++) B[i] = 0;
}
}
int main() {
scanf("%d", &n); n++;
fac[0] = fac[1] = inv[0] = inv[1] = 1;
for (int i = 2; i < n; i++) {
fac[i] = 1ll * fac[i - 1] * i % mod;
inv[i] = 1ll * inv[mod % i] * (mod - mod / i) % mod;
}
for (int i = 2; i < n; i++) inv[i] = 1ll * inv[i - 1] * inv[i] % mod;
for (int i = 0; i < n; i++) g[i] = 1ll * pw(2, 1ll * i * (i - 1) >> 1ll) * inv[i] % mod;
Polynomial::LN(g, f, n);
printf("%lld\n", 1ll * f[n - 1] * fac[n - 1] % mod);
return 0;
}

  

[洛谷P4841]城市规划的更多相关文章

  1. 洛谷 P4841 城市规划 解题报告

    P4841 城市规划 题意 n个有标号点的简单(无重边无自环)无向连通图数目. 输入输出格式 输入格式: 仅一行一个整数\(n(\le 130000)\) 输出格式: 仅一行一个整数, 为方案数 \( ...

  2. 洛谷P4841 城市规划(生成函数 多项式求逆)

    题意 链接 Sol Orz yyb 一开始想的是直接设\(f_i\)表示\(i\)个点的无向联通图个数,枚举最后一个联通块转移,发现有一种情况转移不到... 正解是先设\(g(n)\)表示\(n\)个 ...

  3. 洛谷P4841 城市规划 [生成函数,NTT]

    传送门 题意简述:求\(n​\)个点的简单无向连通图的数量\(\mod \;1004535809​\),\(n \leq 130000​\) 经典好题呀!这里介绍两种做法:多项式求逆.多项式求对数 先 ...

  4. 洛谷 P4841 城市规划

    构造简单无向图的EGF: \[ G(x)=\sum_{i}^{\infty}2^{\binom{i}{2}}\cdot\frac{x^i}{i!} \] 构造简单无向连通图的EGF: \[ F(x)= ...

  5. 洛谷P4841 城市规划(多项式求逆)

    传送门 这题太珂怕了……如果是我的话完全想不出来…… 题解 //minamoto #include<iostream> #include<cstdio> #include< ...

  6. [洛谷P4841][集训队作业2013]城市规划

    传送门 题目大意 求出\(n\)个点的简单(无重边无自环)有标号无向连通图数目.\(n\leq 130000\). 题解 题意非常简单,但做起来很难.这是道生成函数经典题,博主当做例题学习用的.博主看 ...

  7. Solution -「集训队作业 2013」「洛谷 P4841」城市规划

    \(\mathcal{Description}\)   link.   求 \(n\) 个结点的简单无向连通图个数,对 \(1004535809~(479\times2^{21}+1)\) 取模.   ...

  8. [题解] BZOJ 3456 洛谷 P4841 [集训队作业2013]城市规划 多项式,分治FFT

    题目 令\(f_i\)表示n个点的答案.考虑容斥,用所有连边方案减去有多个连通块的方案.枚举1号点所在的连通块大小: \(f_i=2^{i(i-1)/2}-\sum_{j>0}^{i-1}f_j ...

  9. 洛谷P3300 城市规划

    题意:给你一个6 * n的网格题,单点修改,询问区间联通块数.n <= 10w 解:看起来就很显然的一道题......线段树每个点用一个ufs维护连通性.完了. 我为了方便思考把图转成横着的了. ...

随机推荐

  1. java 集合 HashSet 实现随机双色球 HashSet addAll() 实现去重后合并 HashSet对象去重 复写 HashCode()方法和equals方法 ArrayList去重

    package com.swift.lianxi; import java.util.HashSet; import java.util.Random; /*训练知识点:HashSet 训练描述 双色 ...

  2. jquery ajax参数

    //默认请求参数 var _options = { url: null, // 请求连接地址 type: 'GET', // 请求类型(get,post) data: null, // post时请求 ...

  3. poj_1284_Primitive root

    We say that integer x, 0 < x < p, is a primitive root modulo odd prime p if and only if the se ...

  4. scrapy--selenium

    一直在学习scrapy的爬虫知识,但是遇到了动态加载页面的难题,从一开始的javascript渲染器--splash,docker服务, 遇到各种奇葩的问题: 1.docker代理设置添加无效,导致无 ...

  5. MySQL字段属性介绍

    引言 这次Qi号分享MySQL字段属性简介.下面资料是Qi号搜集大量资料与个人理解的整理. MySQL提供了一组可以赋给表中各个列的数据类型,每个类型都强制数据满足为该数据类型预先确定的一组规则,例如 ...

  6. .c和.h区别

    本质没有区别: .h是头文件 一般情况下下边内容放在.h文件中 宏定义 结构体,联合,枚举声明 typedef声明 外部函数声明 全局变量声明 .c是程序文件 一般情况下下边内容放在.h文件中 内含函 ...

  7. Linux下MySQL安装及配置

    Linux下MySQL安装及配置 安装MySQL Ubuntu系统中,直接使用apt install的方式去安装MySQL的服务端和客户端,MySQL的客户端必须安装,否则无法通过命令连接并操作MyS ...

  8. Codeforces Round 97B 点分治

    B. Superset time limit per test 2 seconds memory limit per test 256 megabytes input standard input o ...

  9. mybatis在where中比较复杂的判断

    <if test="param.applicationStateInNumber != null and param.applicationStateInNumber != ''&qu ...

  10. 7 定制10MINs首页2

    1.添加 <div class="ui basic segment"> <h1 class="ui center aligned header" ...