题意:

求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. python(day17)二分查找

    l = [1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31] def find(l ,aim ,start = 0,end = None): end = len(l ...

  2. C#中Skip和Take的用法

    Skip()和Take()方法都是IEnumerable<T> 接口的扩展方法,包括C#中的所有Collections类,如ArrayList,Queue,Stack等等,还有数组和字符串 ...

  3. selenium-确认进入了预期页面(四)

    selenium确认进入了预期页面 在自动化操作中,浏览器每次进入一个新的需要,都需要确认该页面是否打开或打开的页面是否是预期的页面 需要进行确认页面后方可进行下一步操作 确认页面有很多中方法,像笔者 ...

  4. AXI-Lite总线及其自定义IP核使用分析总结

    ZYNQ的优势在于通过高效的接口总线组成了ARM+FPGA的架构.我认为两者是互为底层的,当进行算法验证时,ARM端现有的硬件控制器和库函数可以很方便地连接外设,而不像FPGA设计那样完全写出接口时序 ...

  5. go语言学习-常用命令(四)

    go常用命令 go get:获取远程包(得装git) go run:直接运行程序(写代码时调试用) go build:测试编译,检查是否有编译错误 go fmt:格式化代码(一般不咋用,IDE都自带了 ...

  6. thinkphp v5.1 开发笔记

    一.安装TP5.1 1.使用git安装 <1>下载Tp git clone https://github.com/top-think/think tp5 <2>安装核心库 gi ...

  7. jenkins+gitlab配置

    jenkins配置 插件配置 Jenkins要实现持续集成自动部署需要安装  gitlab  maven Publish Over SSH  Git等几个插件 查看已经安装的插件 jenkins上集成 ...

  8. 在Visual Studio 2017上配置Glut

    在Visual Studio 2017上配置Glut 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 在Visual Studio 2017上配置并使用 ...

  9. c#实验一:基于winform的冒泡排序练习

    一.界面设计 在排序前textbox中输入数字,以逗号隔开,通过两个button实现降序排序或升序排序,然后在排序后textbox中显示 三个关键点: 1.监测输入是否合法,最好使用正则表达式 2.拆 ...

  10. 爬虫系列二(数据清洗--->正则表达式)

    一 正则常识 模式 描述 \w 匹配字母数字及下划线 \W 匹配非字母数字及下划线 \s 匹配任意空白字符,等价于 [\t\n\r\f]. \S 匹配任意非空字符 \d 匹配任意数字,等价于 [0-9 ...