题目

一句话题意,无向连通图计数

技不如人,甘拜下风

设\(f_i\)表示\(i\)个节点构成的无向连通图数量

之后。。。之后就不会了

于是抄题解

考虑容斥

\[f_i=t_i-\sum_{j=1}^{i-1}\binom{i-1}{j-1}f_jt_{i-j}
\]

\(t_i\)表示\(i\)个节点构成的无向图数量,实际上\(t_i=2^{\frac{i(i-1)}{2}}\),就是每一条边都有存在或者不存在两种选择,这样显然不能保证联通

上面那个柿子的含义就是先算上所有情况,减掉不连通的,先选择\(j-1\)个点和\(1\)号节点联通,之后剩下的\(i-j\)个节点自己随便连去吧,由于两部分没有联通,所以整张图一定不会联通

我们觉得让\(f_i\)在外面孤独的待着不太好,于是我们可以把\(f_i\)放进来

就有

\[t_i-\sum_{j=1}^n\binom{i-1}{j-1}f_jt_{i-j}
\]

因为当\(j=i\)的时候,\(\binom{i-1}{j-1}=t_{i-j}=1\),所以可以把\(f_i\)放进来

拆组合数

\[t_i=\sum_{j=1}^n\frac{(i-1)!f_jt_{i-j}}{(j-1)!(i-j)!}
\]

\((i-1)!\)真多余,让它出来

\[\frac{t_i}{(i-1)!}=\sum_{j=1}^n\frac{f_j}{(j-1)!}\times \frac{t_{i-j}}{(i-j)!}
\]

考虑生成函数,设

\[G(x)=\frac{t_x}{(x-1)!},F(x)=\frac{f_i}{(i-1)!},T(x)=\frac{t_x}{x!}
\]

于是我们直观发现应该写成

\[G(x)=F(x) \times T(x)
\]

于是\(F(x)=\frac{G(x)}{T(x)}\),多项式求逆就好了

代码

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define re register
#define LL long long
const int maxn=262144+1005;
const LL mod=1004535809;
LL G[2];
LL K[maxn],T[maxn],C[maxn];
LL fac[maxn],t[maxn],pow[maxn],A[maxn],R[maxn],B[maxn],ifac[maxn];
int rev[maxn],n,len;
inline LL ksm(LL a,LL b) {LL S=1;while(b) {if(b&1) S=S*a%mod;b>>=1;a=a*a%mod;}return S;}
inline void NTT(LL *f,int o) {
for(re int i=0;i<len;i++) if(i<rev[i]) std::swap(f[i],f[rev[i]]);
for(re int i=2;i<=len;i<<=1) {
int ln=i>>1;LL og1=ksm(G[o],(mod-1)/i);
for(re int l=0;l<len;l+=i) {
LL t,og=1;
for(re int x=l;x<l+ln;x++) {
t=(og*f[ln+x])%mod;
f[ln+x]=(f[x]-t+mod)%mod;
f[x]=(f[x]+t)%mod;
og=(og*og1)%mod;
}
}
}
if(!o) return;
LL inv=ksm(len,mod-2);
for(re int i=0;i<len;i++) f[i]=(f[i]*inv)%mod;
}
inline void mul(int n,LL *A,LL *B) {
len=1;while(len<n+n) len<<=1;
for(re int i=0;i<len;i++) rev[i]=rev[i>>1]>>1|((i&1)?len>>1:0);
NTT(A,0),NTT(B,0);for(re int i=0;i<len;i++) A[i]=(A[i]*B[i])%mod;
NTT(A,1);for(re int i=n;i<len;i++) A[i]=0;
}
inline void Inv(int n,LL *A,LL *B) {
if(n==1) {B[0]=ksm(A[0],mod-2);return;}
Inv((n+1)>>1,A,B);
memset(C,0,sizeof(C));memset(T,0,sizeof(T));memset(K,0,sizeof(K));
for(re int i=0;i<n;i++) C[i]=K[i]=B[i],T[i]=A[i];
mul(n,C,K);mul(n,C,T);
for(re int i=0;i<n;i++) B[i]=(2ll*B[i]-C[i]+mod)%mod;
}
int main() {
G[0]=3,G[1]=ksm(3,mod-2);
scanf("%d",&n);
pow[0]=1;for(re int i=1;i<=n;i++) pow[i]=(pow[i-1]*2ll)%mod;
fac[0]=1;for(re int i=1;i<=n;i++) fac[i]=(fac[i-1]*(LL)i)%mod;
t[0]=1;t[1]=1;for(re int i=2;i<=n;i++) t[i]=(t[i-1]*pow[i-1])%mod;
ifac[n]=ksm(fac[n],mod-2);
for(re int i=n-1;i>=0;--i) ifac[i]=(ifac[i+1]*(LL)(i+1))%mod;
for(re int i=0;i<=n;i++) B[i]=t[i]*ifac[i]%mod;
for(re int i=1;i<=n;i++) A[i]=t[i]*ifac[i-1]%mod;
Inv(n+1,B,R);mul(n+1,A,R);
printf("%lld\n",A[n]*fac[n-1]%mod);
return 0;
}

【bzoj3456】 城市规划的更多相关文章

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

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

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

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

  3. 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)*( ...

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

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

  5. BZOJ3456 城市规划 【分治NTT】

    题目链接 BZOJ3456 题解 据说这题是多项式求逆 我太弱不会QAQ,只能\(O(nlog^2n)\)分治\(NTT\) 设\(f[i]\)表示\(i\)个节点的简单无向连通图的数量 考虑转移,直 ...

  6. BZOJ3456: 城市规划

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

  7. BZOJ3456城市规划

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

  8. BZOJ3456 城市规划 【生成函数】【FFT】

    题目分析: 容易想到生成函数的构造方法. 令g(n)表示n个点的无向图个数,f(n)表示n个点的无向连通图的个数.式子是显然的. 容易发现式子是卷积的形式,写出生成函数,然后多项式求逆后多项式乘法即可 ...

  9. 2019.01.03 bzoj3456: 城市规划(生成函数+多项式取对)

    传送门 生成函数好题. 题意:求n个点的简单(无重边无自环)无向连通图数目 思路: 对简单无向图构造生成函数f(x)=∑n2Cn2xnn!f(x)=\sum_n2^{C_n^2}\frac{x^n}{ ...

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

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

随机推荐

  1. SQL Server 获取(本周、本月、本旬、本季、本年)的某一天

    /*------------------------------本周----------------------------------------*/ --本周第一天 ),getdate()) -- ...

  2. 删除Panl控件中窗体的方法

    //删除窗体方法 private void CloseFrm() { foreach (Control item in panel1.Controls) { if (item is Form) //判 ...

  3. 关于C#委托和Lambda表达式

    关于C#委托和Lambda表达式 1.C#委托和Lambda表达式结合定义方法非常方便 在定一次性方法有很好的应用 delegate void getProductNoReturn(int a); d ...

  4. XML文档的解析—dom4j

    XML为可扩展标记语言,它主要是用来保存数据,做配置文件,数据传输载体等.其实就是一个后缀名为.xml的文件. XML命名规则 名称可以含字母.数字以及其他的字符 名称不能以数字或者标点符号开始 名称 ...

  5. Django(二):url和views

    网络通讯的本质是socket,从socket封装到MVC模式,参见另外几篇博客.本节笔记整理自Django2.0官方文档. 一.url调度器 - django.urls.path django2.0中 ...

  6. 【SSH网上商城项目实战05】完成数据库的级联查询和分页

    转自:https://blog.csdn.net/eson_15/article/details/51320212 上一节我们完成了EasyUI菜单的实现.这一节我们主要来写一下CategorySer ...

  7. poj Strange Way to Express Integers 中国剩余定理

    Strange Way to Express Integers Time Limit: 1000MS   Memory Limit: 131072K Total Submissions: 8193   ...

  8. php中怎么导入自己写的类

    如果写的类是写在当前php文件内,就直接实例化若你的类写在其他的php文件里,就要先用include或require,将类文件引入<?php include("class.php&qu ...

  9. NodeList、HTMLCollection和NamedNodeMap

    上篇文章以arguments为例讲到了类数组对象,这篇我们讨论更多的类数组对象NodeList.HTMLCollection和NamedNodeMap.既然是类数组对象,这3种对象也都能应用上篇文章中 ...

  10. Java学习---JFreeChart动态图表

    JFreeChart是Java中开源的制图组件,主要用于生成各种动态图表.在Java的图形报表技术中,JFreeChart组件提供了方便.快捷.灵活的制图方法.作为一个功能强大的图形报表组件,JFre ...