题意:

求n个点的无相连通图的个数。有编号

思路一:

黏博客

至于为什么除以k!:(没有博客中说的那么简单)

实际上,

对于一个n的用k个自然数的拆分,每一个拆分的贡献是:

$\frac{n!*\Pi contribution}{\Pi cnt[i]!*\Pi i!}$这里i是所有出现过的自然数,cnt表示出现次数

因为认为集合两两之间都是不同的,但是对于相同的i,会计算多次。要除以出现次数的阶乘。对于不同的i,本身sz就不同,所以不会重复

然后考虑每个自然数拆分的方案数:

$f^k$

但是每个自然数拆分,会被计算:$\frac{k!}{\Pi cnt[i]}$次,再除掉

所以,实际上,贡献就是:$\frac{n!*\Pi contribution}{k!*\Pi i!}$

就是$\frac{f^k}{k!}$的第n项再乘上$n!$

然后就可以用麦克劳林展开,推出e^f的式子了

思路二:

考虑dp

f[i],i个点的ans

无向图很好算.2^(C(n,2))

考虑在所有无向图中减去不连通的

不连通意味着某个点不能到达所有其他点

不妨从1来观察

枚举和1的联通块大小j

设g(n,j),表示n个点,和1联通块大小为j的无向连通图个数

g(n,j)=C(n-1,j-1)*2^(C(n-j,2))*f[j]

f[n]=2^(C(n,2)-∑g(n,j) (1<=j<=n-1)

把g和f的关系带进去

然后移项过去,发现可以把j范围变成(1<=j<=n)就消掉了f[n]项

组合数展开,可以NTT

然后再转化成逆元

注意,这个逆元是在mod x^(n+1)下的

最后乘出来的长度是2*n的

注意长度

#include<bits/stdc++.h>
#define il inline
#define reg register int
#define int long long
#define numb (ch^'0')
using namespace std;
typedef long long ll;
il void rd(int &x){
char ch;bool fl=false;
while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);
for(x=numb;isdigit(ch=getchar());x=x*+numb);
(fl==true)&&(x=-x);
}
namespace Miracle{
const int N=*+;
const int mod=;
const int G=;
ll GI;
int n;
ll jie[N],ivv[N];
ll f[N],ni[N],p[N],g[N],t[N],d[N],e[N];
int rev[N];
int qm(int x,int y){
int ret=;
while(y){
if(y&) ret=(ll)ret*x%mod;
x=(ll)x*x%mod;
y>>=;
}
return ret;
}
int mo(int x){
return x>=mod?x-mod:x;
}
void pre(int n){
for(reg i=;i<n;++i){
rev[i]=rev[i>>]>>|((i&)?n>>:);
}
}
void NTT(int *f,int n,int c){
for(reg i=;i<n;++i){
if(i>rev[i]){
f[i]^=f[rev[i]]^=f[i]^=f[rev[i]];
}
}
for(reg p=;p<=n;p<<=){
int gen;
if(c==) gen=qm(G,(mod-)/p);
else gen=qm(GI,(mod-)/p);
for(reg l=;l<n;l+=p){
int buf=;
for(reg k=l;k<l+p/;++k){
int tmp=(ll)buf*f[k+p/]%mod;
f[k+p/]=mo(f[k]-tmp+mod);
f[k]=mo(f[k]+tmp);
buf=(ll)buf*gen%mod;
}
}
}
}
void calc(int *f,int *g,int n){
for(reg i=;i<n;++i){
rev[i]=rev[i>>]>>|((i&)?n>>:);
}
NTT(f,n,);NTT(g,n,);
for(reg i=;i<n;++i) f[i]=(ll)f[i]*g[i]%mod;
NTT(f,n,-);
ll iv=qm(n,mod-);
for(reg i=;i<n;++i) f[i]=(ll)f[i]*iv%mod;
}
void inv(int *f,int *g,int n){//mod n
if(n==){
g[]=qm(f[],mod-);return;
}
inv(f,g,n>>);
for(reg i=;i<n/;++i) d[i]=g[i],e[i]=f[i];
for(reg i=n/;i<=n;++i) d[i]=,e[i]=f[i];
for(reg i=n+;i<=*n;++i) d[i]=,e[i]=; for(reg i=;i<*n;++i){
rev[i]=rev[i>>]>>|((i&)?(*n)>>:);
}
NTT(d,*n,);NTT(e,*n,);
for(reg i=;i<*n;++i){
g[i]=mo(mo(*d[i])-(ll)e[i]*d[i]%mod*d[i]%mod+mod);
}
NTT(g,*n,-);
ll iv=qm(*n,mod-);
for(reg i=;i<*n;++i){
if(i<n) g[i]=(ll)g[i]*iv%mod;
else g[i]=;
}
}
int main(){
rd(n);
GI=qm(G,mod-);
int len,lp;
for(lp=n,len=;len<=lp;len<<=);
jie[]=;
for(reg i=;i<len;++i){
jie[i]=jie[i-]*i%mod;
}
ivv[len-]=qm(jie[len-],mod-);
for(reg i=len-;i>=;--i){
ivv[i]=ivv[i+]*(i+)%mod;
}
for(reg i=;i<len;++i){
g[i]=qm(,(ll)(i-)*i/)*ivv[i]%mod;
if(i)t[i]=qm(,(ll)(i-)*i/)*ivv[i-]%mod;
else t[i]=;
}
// cout<<" gg "<<endl;
// for(reg i=0;i<=n;++i){
// cout<<g[i]<<" ";
// }
// cout<<" tt "<<endl;
// for(reg i=0;i<=n;++i){
// cout<<t[i]<<" ";
// }cout<<endl;
inv(g,ni,len);
// //for(reg i=n+1;i<=)
// cout<<" ni "<<endl;
// for(reg i=0;i<=10;++i){
// cout<<ni[i]<<" ";
// }cout<<endl; len*=;
pre(len);
NTT(ni,len,);NTT(t,len,);
for(reg i=;i<len;++i){
f[i]=ni[i]*t[i]%mod;
}
NTT(f,len,-);
ll iv=qm(len,mod-);
for(reg i=;i<len;++i) f[i]=f[i]*iv%mod;
printf("%lld",f[n]*jie[n-]%mod);
return ;
} }
signed main(){
Miracle::main();
return ;
} /*
Author: *Miracle*
Date: 2019/2/3 21:43:20
*/

luoguP4841 城市规划的更多相关文章

  1. COGS 2353 2355 2356 2358 有标号的DAG计数

    不用连通 枚举入度为0的一层 卷积 发现有式子: 由$n^2-i^2-(n-i)^2=2*i*(n-i)$ 可得$2^{i*(n-i)}=\frac{{\sqrt 2}^{(n^2)}}{{\sqrt ...

  2. [WC2019] 数树

    [WC2019] 数树 Zhang_RQ题解(本篇仅概述) 前言 有进步,只做了半天.... 一道具有极强综合性的数数好题! 强大的多合一题目 精确地数学推导和耐心. 有套路又不失心意. 融合了: 算 ...

  3. [题解] LuoguP4841 [集训队作业2013]城市规划

    Description 求\(n\)个点无重边.无自环.带标号的无向联通图个数,对\(1004535809\)(\(479 \times 2^{21} + 1\))取模.\(n \le 130000\ ...

  4. 浅谈城市规划在移动GIS方面的应用发展

    1.概述 城市建设进程加快,城市规划管理工作日趋繁重,各种来源的数据产生各种层出不穷的问题,严重影响城市规划时的准确性,为此全面合理的掌握好各方面的城市规划资料才能做出更加科学的决策.移动端的兴起为规 ...

  5. 【BZOJ-1952】城市规划 [坑题] 仙人掌DP + 最大点权独立集(改)

    1952: [Sdoi2010]城市规划 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 73  Solved: 23[Submit][Status][ ...

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

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

  7. 【BZOJ3456】城市规划(生成函数,多项式运算)

    [BZOJ3456]城市规划(生成函数,多项式运算) 题面 求\(n\)个点的无向连通图个数. \(n<=130000\) 题解 \(n\)个点的无向图的个数\(g(n)=2^{C_n^2}\) ...

  8. 洛谷 P4841 城市规划 解题报告

    P4841 城市规划 题意 n个有标号点的简单(无重边无自环)无向连通图数目. 输入输出格式 输入格式: 仅一行一个整数\(n(\le 130000)\) 输出格式: 仅一行一个整数, 为方案数 \( ...

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

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

随机推荐

  1. textarea 输入长度限制

    <textarea " placeholder="请输入详细地址(100字以内)"></textarea>

  2. Linux命令大全 欢迎补充 评论添加~

    系统信息  arch 显示机器的处理器架构(1)  uname -m 显示机器的处理器架构(2)  uname -r 显示正在使用的内核版本  dmidecode -q 显示硬件系统部件 - (SMB ...

  3. Linux分页机制之概述--Linux内存管理(六)

    1 分页机制 在虚拟内存中,页表是个映射表的概念, 即从进程能理解的线性地址(linear address)映射到存储器上的物理地址(phisical address). 很显然,这个页表是需要常驻内 ...

  4. LeetCode算法题-Design HashMap(Java实现)

    这是悦乐书的第299次更新,第318篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第167题(顺位题号是706).在不使用任何内置哈希表库的情况下设计HashMap.具体 ...

  5. LeetCode算法题-Number Complement(Java实现-五种解法)

    这是悦乐书的第240次更新,第253篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第107题(顺位题号是476).给定正整数,输出其补码数.补充策略是翻转其二进制表示的位 ...

  6. CentOS7.2重置root密码的处理方法

    第一个里程碑 --在启动GRUB菜单中选择编辑选项,按键 "e" 进入编辑; 第二个里程碑 -- 大约在第16行找到 "ro" 将 "ro" ...

  7. Linux文件目录

    简介: Linux 内核最初由芬兰的 Linus Torvalds 开发,后来他组建了团队,Linux 内核由这个团队维护. GNU 组织开发了很多核心软件和基础库,例如 GCC 编译器.C语言标准库 ...

  8. 跨域 - 自定义 jsonp实现跨域

    问题:在现代浏览器中默认是不允许跨域. 办法:通过jsonp实现跨域   在js中,我们直接用XMLHttpRequest请求不同域上的数据时,是不可以的.但是,在页面上引入不同域上的js脚本文件却是 ...

  9. 解决IntelliJ IDEA 创建Maven项目速度慢问题

    IntelliJ IDEA 创建maven项目速度很慢,甚至卡住不动了. 原因 IDEA根据maven archetype的本质,其实是执行mvn archetype:generate命令,该命令执行 ...

  10. 日版iphone5 SB 配合REBELiOS卡贴破解电信3G步骤

    1.插入贴膜卡和sim卡:进入“设置—电话—sim卡应用程序”选择CDMA电信解锁: 2.越狱设备,添加cydia.gpplte.com源,安装“6S/6/5S/5C/5电信新补丁”: 3.打卡gpp ...