luoguP4841 城市规划
题意:
求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 城市规划的更多相关文章
- 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 ...
- [WC2019] 数树
[WC2019] 数树 Zhang_RQ题解(本篇仅概述) 前言 有进步,只做了半天.... 一道具有极强综合性的数数好题! 强大的多合一题目 精确地数学推导和耐心. 有套路又不失心意. 融合了: 算 ...
- [题解] LuoguP4841 [集训队作业2013]城市规划
Description 求\(n\)个点无重边.无自环.带标号的无向联通图个数,对\(1004535809\)(\(479 \times 2^{21} + 1\))取模.\(n \le 130000\ ...
- 浅谈城市规划在移动GIS方面的应用发展
1.概述 城市建设进程加快,城市规划管理工作日趋繁重,各种来源的数据产生各种层出不穷的问题,严重影响城市规划时的准确性,为此全面合理的掌握好各方面的城市规划资料才能做出更加科学的决策.移动端的兴起为规 ...
- 【BZOJ-1952】城市规划 [坑题] 仙人掌DP + 最大点权独立集(改)
1952: [Sdoi2010]城市规划 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 73 Solved: 23[Submit][Status][ ...
- BZOJ 3456: 城市规划 [多项式求逆元 组合数学 | 生成函数 多项式求ln]
3456: 城市规划 题意:n个点组成的无向连通图个数 以前做过,今天复习一下 令\(f[n]\)为n个点的无向连通图个数 n个点的完全图个数为\(2^{\binom{n}{2}}\) 和Bell数的 ...
- 【BZOJ3456】城市规划(生成函数,多项式运算)
[BZOJ3456]城市规划(生成函数,多项式运算) 题面 求\(n\)个点的无向连通图个数. \(n<=130000\) 题解 \(n\)个点的无向图的个数\(g(n)=2^{C_n^2}\) ...
- 洛谷 P4841 城市规划 解题报告
P4841 城市规划 题意 n个有标号点的简单(无重边无自环)无向连通图数目. 输入输出格式 输入格式: 仅一行一个整数\(n(\le 130000)\) 输出格式: 仅一行一个整数, 为方案数 \( ...
- 【BZOJ3456】城市规划 多项式求逆
[BZOJ3456]城市规划 Description 刚刚解决完电力网络的问题, 阿狸又被领导的任务给难住了. 刚才说过, 阿狸的国家有n个城市, 现在国家需要在某些城市对之间建立一些贸易路线, 使得 ...
随机推荐
- 总结XSS与CSRF两种跨站攻击
XSS:跨站脚本(Cross-site scripting),实际应是"CSS",但由于和层叠样式表CSS名称冲突,故改为"XSS" CSRF:跨站请求伪造(C ...
- C# 批量插入数据方法
批量插入数据方法 void InsertTwo(List<CourseArrangeInfo> dtF) { Stopwatch watch = new Stopwatch(); watc ...
- mysql使用索引的注意事项
使用索引的注意事项 使用索引时,有以下一些技巧和注意事项: 1.索引不会包含有NULL值的列 只要列中包含有NULL值都将不会被包含在索引中,复合索引中只要有一列含有NULL值,那么这一列对于此复合索 ...
- SQLServer之创建视图
视图定义 视图是一个虚拟的表,是一个表中的数据经过某种筛选后的显示方式,视图由一个预定义的查询select语句组成. 使用SSMS数据库管理工具创建视图 1.连接数据库,选择数据库,展开数据库-> ...
- (一)走进Metasploit渗透测试框架
渗透测试的流程 渗透测试是一种有目的性的,针对目标机构计算机系统安全的检测评估方法,渗透测试的主要目的是改善目标机构的安全性.渗透测试各个阶段的基本工作: 1.前期交互阶段 在这个阶段,渗透测试工程师 ...
- 持续代码质量管理-SonarQube Scanner部署
1. SonarQube Scanner地址 上一篇文章我们安装了SonarQube-7.3,让我们可以在页面查看代码质量.但是具体的扫描工作则需要SonarQube Scanner完成. 下载页面 ...
- 二、Windows Server 2016 AD 组织单位、组、用户的创建
简介: 组织单位简称OU,OU是(Organizational Unit)的缩写,组织单位是可以将用户.组.计算机和组织单位放入其中的容器.是可以指派组策略设置或委派管理权限的最小作用域或单元. 建立 ...
- SQLServer之创建DML AFTER INSERT触发器
DML AFTER INSERT触发器创建原理 触发器触发时,系统自动在内存中创建deleted表或inserted表,内存中创建的表只读,不允许修改,触发器执行完成后,自动删除. insert触发器 ...
- Spark SQL中列转行(UNPIVOT)的两种方法
行列之间的互相转换是ETL中的常见需求,在Spark SQL中,行转列有内建的PIVOT函数可用,没什么特别之处.而列转行要稍微麻烦点.本文整理了2种可行的列转行方法,供参考. 本文链接:https: ...
- Tomcat与Nginx服务器的配合使用及各自的区别
Nginx常用做静态内容服务和反向代理服务器,以及页面前端高并发服务器.适合做负载均衡,直面外来请求转发给后面的应用服务(tomcat ,django什么的),Tomcat更多用来做做一个应用容器,让 ...