Description

刚刚解决完电力网络的问题, 阿狸又被领导的任务给难住了.

刚才说过, 阿狸的国家有n个城市, 现在国家需要在某些城市对之间建立一些贸易路线, 使得整个国家的任意两个城市都直接或间接的连通. 为了省钱, 每两个城市之间最多只能有一条直接的贸易路径. 对于两个建立路线的方案, 如果存在一个城市对, 在两个方案中是否建立路线不一样, 那么这两个方案就是不同的, 否则就是相同的. 现在你需要求出一共有多少不同的方案.

好了, 这就是困扰阿狸的问题. 换句话说, 你需要求出n个点的简单(无重边无自环)无向连通图数目.

由于这个数字可能非常大, 你只需要输出方案数mod 1004535809(479 * 2 ^ 21 + 1)即可.

Input

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

Output

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

Sample Input

4

Sample Output

38

HINT

对于 100%的数据, n <= 130000

Sol

设i个顶点的简单连通图的个数为\(f[i]\),则我们容斥一下,得到:

\(f[n]=2^{\frac{n(n-1)}{2}}-\sum_{i=1}^{n-1}f[i]*C_{n-1}^{i-1}*2^{\frac{(n-i)(n-i-1)}{2}}\)

意义其实就是所有情况减去联通个数不足n的情况,注意后面要枚举哪些点和1号节点连通,所以要乘个组合数。

我们把组合数拆开,然后两边同除以\((n-1)!\)得到:

\(\sum_{i=1}^{n}\frac{f[i]*2^{\frac{(n-i)(n-i-1)}{2}}}{(i-1)!*(n-i)!}=\frac{2^{\frac{n(n-1)}{2}}}{(i-1)!}\)

如果我们把式子左边拆成两半,会发现这是一个卷积的形式,所以设这些多项式分别为\(A,B,C\),则有\(A*B=C\),所以我们通过\(C\)和\(B^{-1}\)相乘,就得到了\(A\),之后取\(A\)的第n项然后乘个阶乘就是答案。

其实如果\(f[i]\)表示i+1个点的答案的话,好像会简洁很多,实质没有变化(我就是这么写的)。

Code

#include <bits/stdc++.h>
using namespace std;
int n,a[262145],b[262145],c[262145],d[262145],P=1004535809,i,j,k,fac[262145],ifa[262145],inv[262145],wn,w,t,len;
int ksm(int a,long long b){int res=1;for(;b;b>>=1,a=1ll*a*a%P) if(b&1) res=1ll*res*a%P;return res;}
void ntt(int *a,int n,int op)
{
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,wn=ksm(3,op==1?(P-1)/k:P-1-(P-1)/k);k<=n;k<<=1,wn=ksm(3,op==1?(P-1)/k:P-1-(P-1)/k))
for(i=0,w=1;i<n;i+=k,w=1) for(j=0;j<(k>>1);j++,w=1ll*w*wn%P)
t=1ll*a[i+j+(k>>1)]*w%P,a[i+j+(k>>1)]=(a[i+j]-t+P)%P,a[i+j]=(a[i+j]+t)%P;
if(op==-1) for(t=ksm(n,P-2),i=0;i<n;i++) a[i]=1ll*a[i]*t%P;
}
void getinv(int *a,int *b,int *c,int n)
{
if(n==1){b[0]=ksm(a[0],P-2);return;}
getinv(a,b,c,n>>1);
memcpy(c,a,sizeof(int)*n);memset(c+n,0,sizeof(int)*n);
ntt(c,n<<1,1);ntt(b,n<<1,1);
for(int i=0;i<(n<<1);i++) b[i]=(b[i]*2ll%P-1ll*b[i]*b[i]%P*c[i]%P+P)%P;
ntt(b,n<<1,-1);memset(b+n,0,sizeof(int)*n);
}
int main()
{
scanf("%d",&n);for(len=1;len<=n;len<<=1);
inv[0]=inv[1]=fac[0]=fac[1]=ifa[0]=ifa[1]=1;
for(int i=2;i<=len;i++) inv[i]=P-1ll*(P/i)*inv[P%i]%P,fac[i]=1ll*fac[i-1]*i%P,ifa[i]=1ll*ifa[i-1]*inv[i]%P;
for(int i=0;i<len;i++) d[i]=1ll*ksm(2,1ll*i*(i+1)/2)*ifa[i]%P;
for(int i=1;i<len;i++) a[i]=1ll*ksm(2,1ll*i*(i-1)/2)*ifa[i]%P;
a[0]=1;getinv(a,b,c,len);ntt(d,len<<1,1);ntt(b,len<<1,1);
for(int i=0;i<(len<<1);i++) b[i]=1ll*b[i]*d[i]%P;
ntt(b,len<<1,-1);printf("%d\n",1ll*b[n-1]*fac[n-1]%P);
}

【bzoj3456】城市规划 dp+多项式求逆的更多相关文章

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

    题目链接 BZOJ3456 题解 之前我们用分治\(ntt\)在\(O(nlog^2n)\)的复杂度下做了这题,今天我们使用多项式求逆 设\(f_n\)表示\(n\)个点带标号无向连通图数 设\(g_ ...

  2. BZOJ 3456: 城市规划(dp+多项式求逆)

    传送门 解题思路 这道题就是求带标号的无向连通图个数,首先考虑\(O(n^2)\)的做法,设\(f_i\)表示有\(i\)个节点的无向连通图个数,那么考虑容斥,先把所有的无向图求出,即为\(2^{C( ...

  3. [BZOJ3456]城市规划(生成函数+多项式求逆+多项式求ln)

    城市规划 时间限制:40s      空间限制:256MB 题目描述 刚刚解决完电力网络的问题, 阿狸又被领导的任务给难住了.  刚才说过, 阿狸的国家有n个城市, 现在国家需要在某些城市对之间建立一 ...

  4. BZOJ3456 城市规划(多项式求逆)

    设f[i]为连通图的数量,g[i]为不连通图的数量,显然有f[i]=2i*(i-1)/2-g[i],g[i]通过枚举1所在连通块大小转移,有g[i]=Σf[j]*C(i-1,j-1)·2(i-j)*( ...

  5. 【bzoj3456】城市规划(多项式求逆+dp)

    Description 求\(~n~\)个点组成的有标号无向连通图的个数.\(~1 \leq n \leq 13 \times 10 ^ 4~\). Solution 这道题的弱化版是poj1737, ...

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

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

  7. BZOJ3456 城市规划 【多项式求ln】

    题目链接 BZOJ3456 题解 真是一道经典好题,至此已经写了分治\(NTT\),多项式求逆,多项式求\(ln\)三种写法 我们发现我们要求的是大小为\(n\)无向联通图的数量 而\(n\)个点的无 ...

  8. CF848E Days of Floral Colours——DP+多项式求逆/分治NTT

    官方题解:http://codeforces.com/blog/entry/54233 就是由简入繁 1.序列处理,只考虑一个半圆 2.环形处理(其实这个就是多了旋转同构) 然后基于分割线邻居的跨越与 ...

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

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

随机推荐

  1. python's twenty eithth day for me 模块和包

    模块: 什么是模块: 常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀,但其实import加载的模块分为四个通用类别: 1,使用python编写的代码 ...

  2. 如何在老惠普电脑上安装windows xp系统

    如何在老惠普电脑上安装windows xp系统 前提,老式的紧凑的惠普台式机,装了linux系统,想要装windows xp系统另作他用.但是使用U盘PE怎么也进不了? 解决办法: 1.拆下惠普主机上 ...

  3. python ftp 上传

    #!/usr/bin/python # -*-coding:utf- -*- from ftplib import FTP def ftpconnect(host,username,password) ...

  4. Valid timeZone Values(转)

    https://www.vmware.com/support/developer/vc-sdk/visdk400pubs/ReferenceGuide/timezone.html Valid time ...

  5. Java微信公众平台开发(一)--接入微信公众平台

    转自:http://www.cuiyongzhi.com/post/38.html (一)接入流程解析 在我们的开发过程中无论如何最好的参考工具当然是我们的官方文档了:http://mp.weixin ...

  6. Linux下zip格式文件的解压缩和压缩

    Linux下zip格式文件的解压缩和压缩 Linux下的软件包很多都是压缩包,软件的安装就是解压缩对应的压缩包.所以,就需要熟练使用常用的压缩命令和解压缩命令.最常用的压缩格式有.tar.gz/tgz ...

  7. go语言 robfig/cron包 实现定时 调用

    package main import ( "github.com/robfig/cron" "time" "fmt" "os&q ...

  8. SpringMVC简单的文件上传

    引入依赖包: <!-- 文件上传的依赖 --> <dependency> <groupId>commons-fileupload</groupId> & ...

  9. js如何解析后台传过来的json字符串

    1.js如何解析后台传过来的json字符串? 注意:js是无法直接接收和使用json或者Php的数据,用的话会出现undefined,所以要转换一下. 方式一: var str = '{"r ...

  10. 数字图像处理实验(17):PROJECT 06-04,Color Image Segmentation 标签: 图像处理MATLAB 2017-05-27 21:13

    实验报告: Objective: Color image segmentation is a big issue in image processing. This students need to ...