Description

刚刚解决完电力网络的问题, 阿狸又被领导的任务给难住了.
 刚才说过, 阿狸的国家有n个城市, 现在国家需要在某些城市对之间建立一些贸易路线, 使得整个国家的任意两个城市都直接或间接的连通. 为了省钱, 每两个城市之间最多只能有一条直接的贸易路径. 对于两个建立路线的方案, 如果存在一个城市对, 在两个方案中是否建立路线不一样, 那么这两个方案就是不同的, 否则就是相同的. 现在你需要求出一共有多少不同的方案.
 好了, 这就是困扰阿狸的问题. 换句话说, 你需要求出n个点的简单(无重边无自环)无向连通图数目.
 由于这个数字可能非常大, 你只需要输出方案数mod 1004535809(479 * 2 ^ 21 + 1)即可.

Input

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

Output

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

题解:

多项式好有趣
 
我们先考虑递推式:
令 $f(n)$ 代表 $n$ 个点简单联通无向图个数.
令 $g(n)$ 代表 $n$ 个点无向图个数 (不要求联通).
不难求出,$g(n)=\frac{n(n-1)}{2}$,即 $\binom{n}{2}$.
然而,$f(n)$ 似乎特别难求.
枚举 $1$ 号点所在的联通块:
 
得 $g(n)=\sum_{i=1}^{n}\binom{n-1}{i-1}f(i)g(n-i)$
 
思考一下该公式代表的含义:
枚举 $1$ 号点所在的联通块大小,其余的点随便连,如何保证不会重复枚举?
每一次 $1$ 号点所在的联通块大小是固定的.
其余的点之间不能连到 $1$ 号点所在联通块中,这样就满足了要求.
 
把 $g(n)$ 带入, 得:
 
$2^{\binom{n}{2}}=\sum_{i=1}^{n}\binom{n-1}{i-1}f(i)2^{\binom{n-i}{2}}$
 
把组合数展开,得:
 
$2^{\binom{n}{2}}=\sum_{i=1}^{n}\frac{(n-1)!}{(i-1)!(n-i)!}f(i)2^{\binom{n-i}{2}}$
 
$(n-1)!$ 似乎有点碍事,除掉!!
 
$\frac{2^{\binom{n}{2}}}{(n-1)!}=\sum_{i=1}^{n}\frac{f(i)2^{\binom{n-i}{2}}}{(i-1)!(n-i)!}$
 
看起来像不像卷积 ??
——似乎不太像.
 
不急不急QAQ,再定义几个函数:
定义 $F(x)=\sum_{i=1}^{\infty}\frac{2^{\binom{i}{2}}}{(i-1)!}$
 
定义 $G(x)=\sum_{i=1}^{\infty}\frac{f(i)}{(i-1)!}$
定义 $H(x)=\sum_{i=0}^{\infty}\frac{2^{\binom{i}{2}}}{i!}$
 
令函数 $X_{i}$ 表示 多项式 $X$ 的第 $i$ 项系数.
 
观察 $\frac{2^{\binom{n}{2}}}{(n-1)!}=\sum_{i=1}^{n}\frac{f(i)2^{\binom{n-i}{2}}}{(i-1)!(n-i)!}$
 
得出: $F_{n}=\sum_{i=1}^{n}G_{i}H_{n-i}$
 
现在,能看出这个是卷积了吧!
 
即 $F(x)=G(x)H(x)$
 
我们要求的是 $G(x)$,则 $G(x)=F(x)H(x)^{-1}$.
 
来一波多项式求逆即可.  
 

Code:

#include <bits/stdc++.h>
#define N 3333300
#define mod 1004535809
#define ll long long
#define setIO(s) freopen(s".in","r",stdin)
#define shut fclose(stdin),fclose(stdout)
using namespace std;
int qpow(int x,int y)
{
int tmp = 1;
while(y)
{
if(y&1) tmp=1ll*tmp*x%mod;
x=1ll*x*x%mod,y>>=1;
}
return tmp;
}
namespace NTT
{
int a[N],b[N],f[N],g[N];
void NTT(int *a,int len,int opt){
for(int i = 0,k = 0;i < len; ++i)
{
if(i > k) swap(a[i],a[k]);
for(int j = len >> 1;(k^=j)<j;j>>=1);
}
for(int k = 2;k <= len;k <<= 1)
{
int t = (k>>1),x=qpow(3,(mod-1)/k);
if(opt==-1) x=qpow(x,mod-2);
for(int i=0;i<len;i+=k)
{
int w=1;
for(int j=i;j<i+t;++j)
{
int tmp=1ll*a[j+t]*w%mod;
a[j+t]=(a[j]-tmp+mod)%mod;
a[j]=(a[j]+tmp)%mod;
w=1ll*w*x%mod;
}
}
}
if(opt==-1) for(int i=0,t=qpow(len,mod-2);i<len;++i) a[i]=1ll*a[i]*t%mod;
}
void solve(int *a,int *b,int len)
{
if(len==1) { b[0]=qpow(a[0],mod-2); return ; }
solve(a,b,len>>1);
for(int i=0;i<len;++i) f[i]=a[i],g[i]=b[i];
NTT(f,len<<1,1),NTT(g,len<<1,1);
for(int i=0;i<(len<<1);++i) f[i]=((1ll*f[i]*g[i])%mod*g[i])%mod;
NTT(f,len<<1,-1);
for(int i=0;i<len;++i) b[i]=((b[i]<<1)%mod-f[i]+mod)%mod;
}
void Inv(int *a,int *b,int len)
{
int m = 1;
while(m <= len) m <<= 1;
solve(a,b,m);
}
};
int inv[N],jc[N],jv[N];
int p[N],G[N],C[N],F[N],D[N];
int main()
{
// setIO("input");
int n,m;
scanf("%d",&n);
for(m = 1;m <= n;m <<= 1);
inv[0] = jc[0] = inv[1] = jc[1] = jv[0] = jv[1] = 1;
for(int i=2;i<=n;++i)
{
jc[i]=1ll*jc[i-1]*i%mod;
inv[i]=1ll*inv[mod%i]*(mod-mod/i)%mod;
jv[i]=1ll*jv[i-1]*inv[i]%mod;
}
p[0]=p[1]=1;
for(int i=2;i<=n;++i) p[i]=qpow(2,1ll*(i-1)*i/2%(mod-1));
for(int i=0;i<=n;++i) G[i]=1ll*p[i]*jv[i]%mod;
for(int i=1;i<=n;++i) C[i]=1ll*p[i]*jv[i-1]%mod;
NTT::solve(G,D,m);
NTT::NTT(D,m,1);NTT::NTT(C,m,1);
for(int i=0;i<m;++i) F[i]=1ll*D[i]*C[i]%mod;
NTT::NTT(F,m,-1);
printf("%lld\n",1ll*F[n]*jc[n-1]%mod);
return 0;
}

  

BZOJ 3456: 城市规划 多项式求逆的更多相关文章

  1. bzoj 3456 城市规划 多项式求逆+分治FFT

    城市规划 Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 1091  Solved: 629[Submit][Status][Discuss] Desc ...

  2. BZOJ 3456: 城市规划 [多项式求逆元 组合数学 | 生成函数 多项式求ln]

    3456: 城市规划 题意:n个点组成的无向连通图个数 以前做过,今天复习一下 令\(f[n]\)为n个点的无向连通图个数 n个点的完全图个数为\(2^{\binom{n}{2}}\) 和Bell数的 ...

  3. BZOJ 3456: 城市规划 [多项式求逆元 DP]

    题意: 求出n个点的简单(无重边无自环)无向连通图数目.方案数mod 1004535809(479 * 2 ^ 21 + 1)即可. n<=130000 DP求方案 g(n) n个点所有图的方案 ...

  4. 【BZOJ3456】城市规划 多项式求逆

    [BZOJ3456]城市规划 Description 刚刚解决完电力网络的问题, 阿狸又被领导的任务给难住了. 刚才说过, 阿狸的国家有n个城市, 现在国家需要在某些城市对之间建立一些贸易路线, 使得 ...

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

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

  6. BZOJ 3456: 城市规划 与 多项式求逆算法介绍(多项式求逆, dp)

    题面 求有 \(n\) 个点的无向有标号连通图个数 . \((1 \le n \le 1.3 * 10^5)\) 题解 首先考虑 dp ... 直接算可行的方案数 , 容易算重复 . 我们用总方案数减 ...

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

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

  8. bzoj 3456 城市规划 —— 分治FFT / 多项式求逆 / 指数型生成函数(多项式求ln)

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3456 首先考虑DP做法,正难则反,考虑所有情况减去不连通的情况: 而不连通的情况就是那个经典 ...

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

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

随机推荐

  1. QT的creator中图示

    不同的开发工具显示class和相关的用不同的图标表示.但大同小异.但对于QT的creator中图示确实不太好分.看图一目了然.

  2. mysql中使用order 出现错误

  3. VIM 使用 匹配替换命令配合表达式 实现 递增替换

    :let n=100 | g/while/s/\d/\=n / | let n=n+1 before 10 void *thread_function_1(void *arg) { 11 int i; ...

  4. hdu 4858 容器的简单模拟

    我用临接表模拟容器超时 #include<stdio.h> #include<string.h> #include<vector> using namespace ...

  5. 转载 - Catalan数(卡特兰数)

    出处:http://blog.sina.com.cn/s/blog_6aefe4250101asv5.html 什么是Catalan数 说到Catalan数,就不得不提及Catalan序列,Catal ...

  6. 0209利用innobackupex进行简单数据库的备份

    利用innobackupex进行简单数据库的备份yum install perl-DBIyum install perl-DBD-MySQLyum install perl-Time-HiResyum ...

  7. Java基础教程:tutorialspoint-spring mvc

    教程: 来自turorialspoint的Spring MVC 4.1.6教程(英文),官网:https://www.tutorialspoint.com/springmvc/index.htm 离线 ...

  8. Amoeba for MySQL 中间件

      来源:http://docs.hexnova.com/amoeba/ Amoeba for MySQL致力于MySQL的分布式数据库前端代理层,它主要在应用层访问MySQL的时候充当query 路 ...

  9. 卷积神经网络(CNN)基础介绍

    本文是对卷积神经网络的基础进行介绍,主要内容包含卷积神经网络概念.卷积神经网络结构.卷积神经网络求解.卷积神经网络LeNet-5结构分析.卷积神经网络注意事项. 一.卷积神经网络概念 上世纪60年代. ...

  10. cocos2dx 3.1从零学习(二)——菜单、场景切换、场景传值

    回想一下上一篇的内容,我们已经学会了创建一个新的场景scene,加入sprite和label到层中.掌握了定时事件schedule. 我们能够顺利的写出打飞机的主场景框架. 上一篇的内容我练习了七个新 ...