题目描述

求出n个点的简单(无重边无自环)无向连通图数目mod 1004535809(479 * 2 ^ 21 + 1).

输入

仅一行一个整数n(<=130000)

输出

仅一行一个整数, 为方案数 mod 1004535809.

样例输入

3

样例输出

4


题解

容斥原理+NTT+多项式求逆

设 $f_i$ 表示 $i$ 个点的简单无向连通图的数目,$g_i$ 表示 $i$ 个点的简单无向图的数目。

根据定义得 $g_i=2^{\frac{n(n-1}2}$ 。

对于 $f_i$ ,考虑容斥,用 $g_i$ 减去不连通的方案数。枚举不连通图中1号点所在连通块大小 $j$ ,则有:

$$f_i=g_i-\sum\limits_{j=1}^{i-1}C_{i-1}^{j-1}f_jg_{i-j}$$

将组合数展开,得:

$$f_i=g_i-\sum\limits_{j=1}^{i-1}\frac{(i-1)!}{(j-1)!(i-j)!}f_jg_{i-j}$$

两边同时除以 $(i-1)!$ ,整理得:

$$\frac{f_i}{(i-1)!}=\sum\limits_{j=1}^{i-1}\frac{f_j}{(j-1)!}\frac{g_{i-j}}{(i-j)!}$$

设:

$$F(x)=\sum\limits_{i=1}^{\infty}\frac{f_i}{(i-1)!} \\ G(x)=\sum\limits_{i=1}^{\infty}\frac{g_i}{(i-1)!} \\ H(x)=\sum\limits_{i=1}^{\infty}\frac{g_i}{i!}$$

注意到 $F(x)$ 、$H(x)$ 的常数项均为0,因此后面的那个式子相当于 $\sum\limits_{j=0}^iF(x)[j]H(x)[i-j]$ ,是一个卷积的形式。

因此有:

$$F(x)=G(x)-F(x)\times H(x)$$

化简得:

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

剩下的就好办了,根据定义求出 $G(x)$ 和 $H(x)+1$ ,使用多项式求逆求出 $H(x)+1$ 的逆,再与 $G(x)$ 求乘法即可得到 $F(x)$ 。

最后的答案就是 $F(x)[n]\times(n-1)!$ 。

时间复杂度 $O(n\log n)$

#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 262200
#define mod 1004535809
using namespace std;
typedef long long ll;
ll A[N] , B[N] , C[N] , t[N] , fac[N >> 1];
inline ll pow(ll x , ll y)
{
ll ans = 1;
while(y)
{
if(y & 1) ans = ans * x % mod;
x = x * x % mod , y >>= 1;
}
return ans;
}
void ntt(ll *a , int n , int flag)
{
int i , j , k;
for(i = k = 0 ; i < n ; i ++ )
{
if(i > k) swap(a[i] , a[k]);
for(j = n >> 1 ; (k ^= j) < j ; j >>= 1);
}
for(k = 2 ; k <= n ; k <<= 1)
{
ll wn = pow(3 , (mod - 1) / k);
if(flag == -1) wn = pow(wn , mod - 2);
for(i = 0 ; i < n ; i += k)
{
ll w = 1 , t;
for(j = i ; j < i + (k >> 1) ; j ++ , w = w * wn % mod)
t = w * a[j + (k >> 1)] % mod , a[j + (k >> 1)] = (a[j] - t + mod) % mod , a[j] = (a[j] + t) % mod;
}
}
if(flag == -1)
{
k = pow(n , mod - 2);
for(i = 0 ; i < n ; i ++ ) a[i] = a[i] * k % mod;
}
}
void inv(ll *a , ll *b , int n)
{
if(n == 1)
{
b[0] = 1;
return;
}
int i;
inv(a , b , n >> 1);
memcpy(t , a , sizeof(ll) * n);
ntt(t , n << 1 , 1);
ntt(b , n << 1 , 1);
for(i = 0 ; i < n << 1 ; i ++ ) b[i] = b[i] * (2 - t[i] * b[i] % mod + mod) % mod;
ntt(b , n << 1 , -1);
memset(b + n , 0 , sizeof(ll) * n);
}
int main()
{
int n , i , len = 1;
scanf("%d" , &n);
fac[0] = A[0] = 1;
for(i = 1 ; i <= n ; i ++ )
{
fac[i] = fac[i - 1] * i % mod;
A[i] = pow(2 , (ll)i * (i - 1) / 2) * pow(fac[i] , mod - 2) % mod;
B[i] = pow(2 , (ll)i * (i - 1) / 2) * pow(fac[i - 1] , mod - 2) % mod;
}
while(len <= n) len <<= 1;
inv(A , C , len);
ntt(B , len , 1);
ntt(C , len , 1);
for(i = 0 ; i < len ; i ++ ) B[i] = B[i] * C[i] % mod;
ntt(B , len , -1);
printf("%lld\n" , B[n] * fac[n - 1] % mod);
return 0;
}

【bzoj3456】城市规划 容斥原理+NTT+多项式求逆的更多相关文章

  1. 【BZOJ 3456】 3456: 城市规划 (NTT+多项式求逆)

    3456: 城市规划 Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 658  Solved: 364 Description 刚刚解决完电力网络的问题 ...

  2. [bzoj3456] 城市规划 [递推+多项式求逆]

    题面 bzoj权限题面 离线题面 思路 orz Miskcoo ! 先考虑怎么算这个图的数量 设$f(i)$表示$i$个点的联通有标号无向图个数,$g(i)$表示$n$个点的有标号无向图个数(可以不连 ...

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

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

  4. [BZOJ3456]城市规划:DP+NTT+多项式求逆

    写在前面的话 昨天听吕老板讲课,数数题感觉十分的神仙. 于是,ErkkiErkko这个小蒟蒻也要去学数数题了. 分析 Miskcoo orz 带标号无向连通图计数. \(f(x)\)表示\(x\)个点 ...

  5. BZOJ1042 HAOI2008硬币购物(任意模数NTT+多项式求逆+生成函数/容斥原理+动态规划)

    第一眼生成函数.四个等比数列形式的多项式相乘,可以化成四个分式.其中分母部分是固定的,可以多项式求逆预处理出来.而分子部分由于项数很少,询问时2^4算一下贡献就好了.这个思路比较直观.只是常数巨大,以 ...

  6. BZOJ 3456 城市规划 ( NTT + 多项式求逆 )

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3456 题意: 求出\(n\)个点的简单(无重边无自环)无向连通图的个数.(\(n< ...

  7. bzoj 3456 城市规划——分治FFT / 多项式求逆 / 多项式求ln

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3456 分治FFT: 设 dp[ i ] 表示 i 个点时连通的方案数. 考虑算补集:连通的方 ...

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

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

  9. NTT+多项式求逆+多项式开方(BZOJ3625)

    定义多项式$h(x)$的每一项系数$h_i$,为i在c[1]~c[n]中的出现次数. 定义多项式$f(x)$的每一项系数$f_i$,为权值为i的方案数. 通过简单的分析我们可以发现:$f(x)=\fr ...

随机推荐

  1. Servlet——web.xml的配置

    <servlet>: <servlet-name>: 名称 <servlet-class>: 类名 <init-param>: 初始化参数(只有本ser ...

  2. html模板 练习(仿照抽屉网)

    1.页面布局 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UT ...

  3. 08-base镜像

    base 镜像有两层含义: 不依赖其他镜像,从 scratch 构建. 其他镜像可以之为基础进行扩展. 所以,能称作 base 镜像的通常都是各种 Linux 发行版的 Docker 镜像,比如 Ub ...

  4. TPO-17 C2 Reschedule part-time job in campus dining hall

    TPO-17 C2 Reschedule part-time job in campus dining hall 第 1 段 1.Listen to a conversation between a ...

  5. Windows 下在 Python (Anaconda) 中安装 Dlib 库

    0. 引言 介绍在 Windows  操作系统下,在 Python 的 Anaconda 集成环境中,安装 Dlib 库 : 对于不了解源码编译的,或者利用 cmake 方法失败的,可以尝试下此方法: ...

  6. sklearn中的交叉验证(Cross-Validation)

    这个repo 用来记录一些python技巧.书籍.学习链接等,欢迎stargithub地址sklearn是利用python进行机器学习中一个非常全面和好用的第三方库,用过的都说好.今天主要记录一下sk ...

  7. ICPC 沈阳 Problem C

    题意 求n的全排列中将前k个数排序后最长公共子序列>=n-1的个数 思考 我们先把最后可能产生的结果找出来,再找有多少种排列能构成这些结果 设排列为s S like 1,2,3,...,n , ...

  8. 无人驾驶技术之Kalman Filter原理介绍

    基本思想 以K-1时刻的最优估计Xk-1为准,预测K时刻的状态变量Xk/k-1,同时又对该状态进行观测,得到观测变量Zk,再在预测与观之间进行分析,或者说是以观测量对预测量进行修正,从而得到K时刻的最 ...

  9. Qt中容器类应该如何存储对象

    Qt提供了丰富的容器类型,如:QList.QVector.QMap等等.详细的使用方法可以参考官方文档,网上也有很多示例文章,不过大部分文章的举例都是使用基础类型:如int.QString等.如果我们 ...

  10. 【转载】windows安装python2.7后的注册表问题

    原文出自:https://www.cnblogs.com/tlz888/p/6879227.html [提要]win平台上,python2.7官网的安装包在安装后不会添加环境变量且不会把安装信息写入注 ...