博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ 3456: 城市规划 [多项式求逆元 组合数学 | 生成函数 多项式求ln]
阅读量:5807 次
发布时间:2019-06-18

本文共 2439 字,大约阅读时间需要 8 分钟。

题意:n个点组成的无向连通图个数


以前做过,今天复习一下

\(f[n]\)为n个点的无向连通图个数

n个点的完全图个数为\(2^{\binom{n}{2}}\)

和Bell数的推导很类似,枚举第一个cc的点的个数

\[ 2^{\binom{n}{2}} = \sum_{i=1}^n \binom{n-1}{i-1} f(i) 2^{\binom{n-i}{2}} \]
整理后
\[ \frac{2^{\binom{n}{2}}}{(n-1)!} = \sum_{i=1}^n \frac{f(i)}{(i-1)!}\frac{2^{\binom{n-i}{2}}}{(n-i)!} \]
这是卷积的形式
\[ C(x) = A(x)B(x) \rightarrow A(x) = C(x)B^{-1}(x) \]
多项式求逆就可做了

注意\(b_0=1\)

其实就是EGP求ln......

简单的有标号集合计数

\[ G(x) = \sum_{i\ge 0} 2^{\binom{i}{2}}\frac{x^i}{i!} = \sum_{i \ge 0} \frac{F(x)^i}{i!} = e^{F(x)}\\ F(x) = \ln G(x) = \int \frac{G'(x)}{G(x)}dx \]
第一份是多项式求ln的代码,注意EGP要除以阶乘逆元

#include 
#include
#include
#include
#include
using namespace std;typedef long long ll;const int N = (1<<18) + 5;inline int read(){ char c=getchar();int x=0,f=1; while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();} while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();} return x*f;}int P = 1004535809, inv2 = (P+1)/2;inline int Pow(ll a, int b) { ll ans = 1; for(; b; b>>=1, a=a*a%P) if(b&1) ans=ans*a%P; return ans;}ll inv[N];namespace ntt { int g = 3, rev[N]; void dft(int *a, int n, int flag) { int k = 0; while((1<
< n) k++; for(int i=0; i
>1]>>1) | ((i&1)<<(k-1)); if(i < rev[i]) swap(a[i], a[rev[i]]); } for(int l=2; l<=n; l<<=1) { int m = l>>1, wn = Pow(g, flag == 1 ? (P-1)/l : P-1-(P-1)/l); for(int *p = a; p != a+n; p += l) for(int k=0, w=1; k
>1); int n = l<<1; for(int i=0; i
0; i--) b[i] = (ll) inv[i] * b[i-1] %P; b[0] = 0; for(int i=l; i
#include 
#include
#include
#include
#include
using namespace std;typedef long long ll;const int N = (1<<18) + 5;inline int read(){ char c=getchar();int x=0,f=1; while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();} while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();} return x*f;}ll P = 1004535809;inline ll Pow(ll a, int b) { ll ans = 1; for(; b; b>>=1, a=a*a%P) if(b&1) ans=ans*a%P; return ans;}inline void mod(int &x) {if(x>=P) x-=P; else if(x<0) x+=P;}namespace fnt { int n, g=3, rev[N]; void dft(int *a, int n, int flag=1) { for(int i=0; i
>1; ll wn = Pow(g, flag==1 ? (P-1)/l : P-1-(P-1)/l); for(int *p=a; p!=a+n; p+=l) { ll w = 1; for(int k=0; k
>1); int n = 1, k = 0; while(n < l<<1) n<<=1, k++; for(int i=0; i
>1]>>1) | ((i&1)<<(k-1)); for(int i=0; i

转载地址:http://odubx.baihongyu.com/

你可能感兴趣的文章
0001-CDH网络要求(Lenovo参考架构)
查看>>
用C++的源码一键获取密码,超完整的hack教学!
查看>>
Java 字节码结构剖析一 : 常量池
查看>>
Spring Cloud Finchley.SR1 的学习与应用 7 - 服务容错保护 Hystrix
查看>>
我的友情链接
查看>>
#legoo内核# 准则三:舍弃高效而采取可配置性
查看>>
druid 数据库密码加密
查看>>
monit 源码之配置文件解析
查看>>
【IPC通信】Posix消息队列使用异步事件通知
查看>>
Java 中${key}获取应用配置信息
查看>>
知我所知-个人知识管理
查看>>
centos 6.3 禁用selinux、ipv6 的无奈
查看>>
flannel 的连通与隔离 - 每天5分钟玩转 Docker 容器技术(61)
查看>>
python3下multiprocessing、threading和gevent性能对比
查看>>
AsyncTask的版本差异
查看>>
PHP标准库介绍(SPL)
查看>>
我的友情链接
查看>>
DU(1)
查看>>
C程序设计语言--第一章 导言
查看>>
Linux的作业控制
查看>>