无向联通图计数板子

首先,这个太难了,先让我们来求一个简单的:

无向图计数。

一共 \(\frac {n \times (n+1)} 2\) 条可能存在的边,枚举一条边是否存在,就有 \(2^{\frac {n \times (n+1)} 2}\) 个无向图。

回到本题,我们先设 \(f_n\) 是我们要求的 \(n\) 个无向联通图的个数, \(g_n\) 是 \(2^{\frac {n \times (n+1)} 2}\),很明显有:

\[g_n=\sum_{i=1}^n\binom{n-1}{i-1}f_ig_{n-i}
\]

组合数后面的是一个卷积的形式,而组合数本身就是一堆阶乘,这在提示我们使用 EGF,并且本题的模数也是一个 NTT 模数。

\[\frac {g_n} {(n-1)!}=\sum_{i=1}^n \frac {f_i} {(i-1)!} \times \frac {g_{n-i}} {(n-i)!}
\]

然后我们设 \(F(x)\) 是 { \(f_n\) } 的 EGF,\(G(x)\) 是 { \(g_n\) } 的 EGF。

很容易发现:\(g_n=[x^n]G'(x)\),然后就有:

\[G'(x)=F'(x)G(x)
\]
\[\frac {G'(x)} {G(x)}=F'(x)
\]
\[F(x)=\ln G(x)
\]

然后我们就做完了。

贴代码:

#include<cstring>
#include<cstdio>
#define clr(f,len) memset(f,0,(len)<<2)
#define cpy(f,g,len) memcpy(f,g,(len)<<2)
const int G=3,invG=334845270,mod=1004535809,M=7e5+5;
int n,t[M],f[M],inv[M],tor[M];
inline void swap(int&a,int&b){
a^=b^=a^=b;
}
inline void GetRev(int len){
for(int i=0;i<len;++i)t[i]=t[i>>1]>>1|(i&1?len>>1:0);
}
inline void px(int*f,int*g,int len){
for(int i=0;i<len;++i)f[i]=1ll*f[i]*g[i]%mod;
}
inline void der(int*f,int n){
for(int i=1;i<n;++i)f[i-1]=1ll*f[i]*i%mod;
f[n-1]=0;
}
inline void itg(int*f,int n){
for(int i=n;i;--i)f[i]=1ll*f[i-1]*inv[i]%mod;
f[0]=0;
}
inline int pow(int a,int b=mod-2){
int ans=1;
for(;b;b>>=1,a=1ll*a*a%mod)if(b&1)ans=1ll*ans*a%mod;
return ans;
}
void NTT(int*f,bool flag,int n){
int i,k,p,w,w1,len;
for(i=0;i<n;++i)if(i<t[i])swap(f[i],f[t[i]]);
for(p=2;p<=n;p<<=1){
len=p>>1;w1=pow(flag?G:invG,(mod-1)/p);
for(k=0;k<n;k+=p){
w=1;
for(i=k;i<k+len;++i){
int t=1ll*f[i+len]*w%mod;
if((f[i+len]=f[i]-t)<0)f[i+len]+=mod;
if((f[i]=f[i]+t)>mod)f[i]-=mod;
w=1ll*w*w1%mod;
}
}
}
if(flag)return;
int invN=pow(n);
for(i=0;i<n;++i)f[i]=1ll*f[i]*invN%mod;
}
void invp(int*f,int m){
static int b1[M],b2[M],b3[M];
int i,n=1,len;b1[0]=pow(f[0]);
while(n<m)n<<=1;
for(len=2;len<=n;len<<=1){
for(i=0;i<(len>>1);++i)b3[i]=(b1[i]<<1)%mod;
cpy(b2,f,len);
GetRev(len<<1);
NTT(b1,1,len<<1);px(b1,b1,len<<1);
NTT(b2,1,len<<1);px(b1,b2,len<<1);
NTT(b1,0,len<<1);clr(b1+len,len);
for(i=0;i<len;++i)b1[i]=(b3[i]-b1[i]+mod)%mod;
}
cpy(f,b1,m);clr(b1,n<<1);clr(b2,n<<1);clr(b3,n<<1);
}
void lnp(int*f,int n){
static int sav[M];
cpy(sav,f,n);
der(f,n);invp(sav,n);
GetRev(n<<1);
NTT(f,1,n<<1);NTT(sav,1,n<<1);
px(f,sav,n<<1);NTT(f,0,n<<1);
itg(f,n-1);
clr(f+n,n);clr(sav,n);
}
signed main(){
int i,m=1,tmp1,tmp2;
inv[1]=tor[0]=tor[1]=1;
scanf("%d",&n);++n;
while(m<n)m<<=1;
GetRev(m);
for(i=2;i<=m;++i){
inv[i]=1ll*(mod-mod/i)*inv[mod%i]%mod;
tor[i]=1ll*tor[i-1]*i%mod;
}
for(i=0;i<m;++i)f[i]=1ll*pow(2,(1ll*i*(i-1)>>1)%(mod-1))*pow(tor[i])%mod;
lnp(f,m);
printf("%d",1ll*f[n-1]*tor[n-1]%mod);
}

LGP4841题解的更多相关文章

  1. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  2. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  3. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  4. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

  5. 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解

    题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...

  6. 2016ACM青岛区域赛题解

    A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  7. poj1399 hoj1037 Direct Visibility 题解 (宽搜)

    http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...

  8. 网络流n题 题解

    学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...

  9. CF100965C题解..

    求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...

随机推荐

  1. 控制器view生命周期

    控制器View的生命周期方法:只要是控制器的生命周期方法,都是以view开头. 控制器View加载完成时调用- (void)viewDidLoad { [super viewDidLoad];} 控制 ...

  2. Docker安全及日志管理

    Docker安全及日志管理 目录 Docker安全及日志管理 一.Docker容器与虚拟机的区别 1. 隔离与共享 2. 性能与损耗 3. 总结 二.Docker存在的安全问题 1. Docker自身 ...

  3. world.construct(me);

    目录 0 引言 0.1 所谓构造题 0.2 重点是动机 (motivation) 1 实践出真知 1.1 「CSP-S 2021」「洛谷 P7915」回文 1.1.1 题目大意 1.1.2 解题过程 ...

  4. Solution -「HDU 6643」Ridiculous Netizens

    \(\mathcal{Description}\)   Link.   给定一棵含有 \(n\) 个结点的树,点 \(u\) 有点权 \(w_u\),求树上非空连通块的数量,使得连通块内点权积 \(\ ...

  5. Solution -「国家集训队」「洛谷 P2839」Middle

    \(\mathcal{Description}\)   Link.   给定序列 \(\{a_n\}\),\(q\) 组询问,给定 \(a<b<c<d\),求 \(l\le[a,b] ...

  6. traceroute实用命令总结

    在工作中,我们经常会使用到traceroute进行追踪路由,从而判断网络的故障点,或者网络策略限制等原因.对于网络排查traceroute还是有很大用处的. 一.traceroute常用命令参数 用法 ...

  7. 如何封装安全的go

    如何封装安全的go 在业务代码开发过程中,我们会有很大概率使用go语言的goroutine来开启一个新的goroutine执行另外一段业务,或者开启多个goroutine来并行执行多个业务逻辑.所以我 ...

  8. XStream: Stream Processing Platform at Facebook

    这是Facebook在FlinkForward2021上的一个talk, 主题如下 在前面的论文中分析了Facebook的实时计算引擎的设计和选型的考量,里面提到了Facebook的实时计算引擎为了满 ...

  9. 超简单集成华为 HMS MLKit 机器学习服务:银行卡识别 SDK,一键实现银行卡绑定

    前言 小编前面几期文章分别给大家介绍了使用 HMS ML Kit SDK 实现微笑抓拍.证件照 DIY.拍照翻译的功能开发(链接见文章末尾),本次小编给大家带来的是使用 HMS 机器学习服务(ML K ...

  10. [LeetCode]1365. 有多少小于当前数字的数字

    给你一个数组 nums,对于其中每个元素 nums[i],请你统计数组中比它小的所有数字的数目. 换而言之,对于每个 nums[i] 你必须计算出有效的 j 的数量,其中 j 满足 j != i 且 ...