【BZOJ3456】城市规划

Description

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

Input

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

Output

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

Sample Input

3

Sample Output

4

HINT

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

题解:一直打算做来着,前几天终于抽空把这题过了~

设f[n]表示n个点的简单无向连通图数目,先列出大家都会的DP方程:

$f[n]=2^{n(n-1)\over 2}-\sum\limits_{i=1}^{n-1}f[i]C_{n-1}^{i-1}2^{(n-i)(n-i-1)\over 2}$

哎呀好多n-1太烦了,还是令f[n]表示n+1个点的简单无向连通图数目吧:

$f[n]=2^{n(n+1)\over 2}-\sum\limits_{i=0}^{n-1}f[i]C_n^i2^{(n-i)(n-i-1)\over 2}$

组合数很不优美是不是?那就拆了好啦。

$f[n]=2^{n(n+1)\over 2}-n!\sum\limits_{i=0}^{n-1}{f[i]2^{(n-i)(n-i-1)\over 2}\over i!(n-i)!}$

下面我们想把只含有含有n的放到一起,i放到一起,n-i放到一起,于是疯狂移项得到:

${f[n]\over n!}={2^{n(n+1)\over 2}\over n!}-\sum\limits_{i=0}^{n-1}{f[i]\over i!}\cdot{2^{(n-i)(n-i-1)\over 2}\over (n-i)!}$

明朗很多了是不是?令$F(x)={f[x]\over x!},G(x)={2^{x(x+1)\over 2}\over x!},H(x)={2^{x(x-1)\over 2}\over x!}$,特别地,H(0)=0。

所以$F(x)=G(x)-F(x)*H(x)$,$F(x)={G(x)\over 1+H(x)}$,多项式求个逆就好了。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std;
typedef long long ll;
const ll P=1004535809;
const int maxn=(1<<19)+4;
int n;
ll A[maxn],B[maxn],C[maxn],D[maxn],ine[maxn],jc[maxn],jcc[maxn];
inline ll pm(ll x,ll y)
{
ll z=1;
while(y)
{
if(y&1) z=z*x%P;
x=x*x%P,y>>=1;
}
return z;
}
inline void NTT(ll *a,int len,int f)
{
int i,j,k,h;
for(i=k=0;i<len;i++)
{
if(i>k) swap(a[i],a[k]);
for(j=len>>1;(k^=j)<j;j>>=1);
}
ll wn,w,t;
for(h=2;h<=len;h<<=1)
{
if(f==1) wn=pm(3,(P-1)/h);
else wn=pm(3,P-1-(P-1)/h);
for(i=0;i<len;i+=h)
{
w=1;
for(j=i;j<i+h/2;j++) t=w*a[j+h/2]%P,a[j+h/2]=(a[j]-t)%P,a[j]=(a[j]+t)%P,w=w*wn%P;
}
}
if(f==-1)
{
t=pm(len,P-2);
for(i=0;i<len;i++) a[i]=a[i]*t%P;
}
}
void get_inv(ll *F,ll *G,int len)
{
if(len==1)
{
G[0]=pm(F[0],P-2);
return ;
}
int i;
get_inv(F,G,len>>1);
memcpy(C,F,sizeof(F[0])*len);
memset(C+len,0,sizeof(F[0])*len);
NTT(C,len<<1,1),NTT(G,len<<1,1);
for(i=0;i<len<<1;i++) G[i]=(G[i]*2-C[i]*G[i]%P*G[i])%P;
NTT(G,len<<1,-1);
memset(G+len,0,sizeof(F[0])*len);
}
int main()
{
scanf("%d",&n);
int len=1,i;
while(len<=n) len<<=1;
ine[0]=ine[1]=jc[0]=jc[1]=jcc[0]=jcc[1]=1;
for(i=2;i<=len;i++) ine[i]=P-(P/i)*ine[P%i]%P,jc[i]=jc[i-1]*i%P,jcc[i]=jcc[i-1]*ine[i]%P;
for(i=0;i<len;i++) D[i]=pm(2,i*(i+1ll)/2)*jcc[i]%P;
for(i=1;i<len;i++) A[i]=pm(2,i*(i-1ll)/2)*jcc[i]%P;
A[0]=1;
get_inv(A,B,len);
NTT(D,len<<1,1),NTT(B,len<<1,1);
for(i=0;i<len<<1;i++) B[i]=D[i]*B[i]%P;
NTT(B,len<<1,-1);
printf("%lld",(B[n-1]*jc[n-1]%P+P)%P);
return 0;
}

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

  1. BZOJ 3456: 城市规划 多项式求逆

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

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

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

  3. bzoj3456 城市规划 多项式求In

    \(n\)个点的无向联通图的个数 打着好累啊 一定要封装一个板子 记\(C(x)\)为无向图个数的指数型生成函数,\(C(0) = 1\) 记\(G(x)\)为无向联通图个数的指数型生成函数,\(G( ...

  4. 【BZOJ3456】轩辕朗的城市规划 无向连通图计数 CDQ分治 FFT 多项式求逆 多项式ln

    题解 分治FFT 设\(f_i\)为\(i\)个点组成的无向图个数,\(g_i\)为\(i\)个点组成的无向连通图个数 经过简单的推导(枚举\(1\)所在的连通块大小),有: \[ f_i=2^{\f ...

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

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

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

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

  7. 【bzoj3456】城市规划 容斥原理+NTT+多项式求逆

    题目描述 求出n个点的简单(无重边无自环)无向连通图数目mod 1004535809(479 * 2 ^ 21 + 1). 输入 仅一行一个整数n(<=130000) 输出 仅一行一个整数, 为 ...

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

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

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

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

随机推荐

  1. npm安装包卡住不动的解决

    最近诸事不顺,今天更新/安装nodejs各种包也全都卡在各个环节,用ie设了全局代理貌似也没什么改观,于是到网上找找有没有国内镜像站,倒是发现了cnpmjs.org这个网站被推荐比较多,看他们主页,他 ...

  2. git clone Google的代码失败的解决方法

    git clone Google的volley代码遇Q. 想到用代理服务器就可以解决这个问题.Google了一下解决方法,记录下来,分享一下. git config:                 

  3. HTTP 请求未经客户端身份验证方案“Anonymous”授权。

    今天调取WebService的时候报: HTTP 请求未经客户端身份验证方案“Anonymous”授权. 解决办法: 配置文件里改: <basicHttpBinding> <bind ...

  4. 在AD的环境下,更改计算机名导致TFS,无法连接解决办法

    D:\vs2015>tf workspaces /collection:http://10.1.0.104:8080/tfs/dahua.adrms /updateComputerName:WI ...

  5. swagger的说明、配置及使用

    一.What is swagger? 官方介绍:Swagger是一个规范且完整的框架,提供描述.生产.消费和可视化RESTful Web Service.专业角度:Swagger是由庞大工具集合支撑的 ...

  6. Dubbo -- 系统学习 笔记 -- 入门

    Dubbo -- 系统学习 笔记 -- 目录 入门 背景 需求 架构 用法 入门 背景 随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行, ...

  7. 8 -- 深入使用Spring -- 4...5 AOP代理:基于注解的“零配置”方式

    8.4.5 基于注解的“零配置”方式 AspectJ允许使用注解定义切面.切入点和增强处理,而Spring框架则可识别并根据这些注解来生成AOP代理.Spring只是使用了和AspectJ 5 一样的 ...

  8. MySQL --- 计算指定日期为当月的第几周

    SET @d=NOW(); ; 啦啦啦

  9. linux定时任务cron配置[转]

    实现linux定时任务有:cron.anacron.at等,这里主要介绍cron服务. 名词解释: cron是服务名称,crond是后台进程,crontab则是定制好的计划任务表. 软件包安装: 要使 ...

  10. backbone学习笔记:模型(Model)(2)属性验证

    Backbone的属性验证有2种方法: 1.Backbone自带简单的验证方法,但是验证规则需要自己实现 通过validate()方法进行验证,验证规则写在此方法里. var RoomModel = ...