BZOJ 3456: 城市规划 [多项式求逆元 DP]
题意:
求出n个点的简单(无重边无自环)无向连通图数目.
方案数mod 1004535809(479 * 2 ^ 21 + 1)即可.
n<=130000
DP求方案
g(n) n个点所有图的方案数 显然2C(n,2)=2n(n-1)
f(n) n个点连通图的方案数
然后枚举第一个点所在连通块的点数
g(n)=∑i=1..n-1{C(n-1,i-1)*f(i)*g(n-i)}
代入g(n) 两边同除(n-1)!消掉那个组合数上面那块,就变成了卷积的形式
我不写了直接看Miskcoo的公式啦 http://blog.miskcoo.com/2015/05/bzoj-3456
然后C(x)=A(x)*B(x)
A(x)=C(x)*B(x)-1
放在mod (x>n) 意义下求逆元就行了 因为需要的是a[n]
多项式求逆元
去看Miskcoo的教程吧 http://blog.miskcoo.com/2015/05/polynomial-inverse
简单的思路就是知道A(x) mod (x[n/2]) 下的逆元求mod (xn) 下的逆元
方法就是两个同余的式子写出来一减,两边平方再同乘A(x) 再移项
说一点关于意义的理解吧:
A(x)=Q(x)B(x)+R(x) degR<degB
A(x)Ξ0 (mod xn) 就是说A(x)的0..n-1项系数都是0
A(x)B(x)Ξ1 (mod xn) 它们每一项都有xn,否则不可能余数只有1;所以也有xn/2;
注意:
1.最后要乘(n-1)! 不要乘(n-1)
2.多项式求逆元每次长度都不确定,不能先预处理二进制反转
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;
const int N=3e5+;
inline int read(){
char c=getchar();int x=,f=;
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
}
int P=,MOD=P;
ll Pow(ll a,ll b,ll MOD){
ll ans=;
for(;b;b>>=,a=a*a%MOD)
if(b&) ans=ans*a%MOD;
return ans;
}
struct NTT{
int n,rev[N];
ll g;
void ini(int m){
n=;
while(n<m) n<<=;
/*
int k=0;
while((1<<k)<n) k++;
for(int i=0;i<n;i++){
int t=0;
for(int j=0;j<k;j++) if(i&(1<<j)) t|=(1<<(k-j-1));
rev[i]=t;
}
*/
g=;
}
void transform(int *a,int flag,int n){
int k=;
while((<<k)<n) k++;
for(int i=;i<n;i++){
int t=;
for(int j=;j<k;j++) if(i&(<<j)) t|=(<<(k-j-));
if(t<i) swap(a[i],a[t]);
} for(int l=;l<=n;l<<=){
int m=l>>;
ll wn=Pow(g,flag==?(P-)/l:P--(P-)/l,P);
for(int *p=a;p!=a+n;p+=l){
ll w=;
for(int k=;k<m;k++){
ll t=w*p[k+m]%P;
p[k+m]=(p[k]-t+P)%P;
p[k]=(p[k]+t)%P;
w=w*wn%P;
}
}
}
if(flag==-){
ll inv=Pow(n,P-,P);
for(int i=;i<n;i++) a[i]=a[i]*inv%P;
}
}
int c[N];
void test(int *a,int n){for(int i=;i<n;i++) printf("%d ",a[i]);puts("");}
void polyInv(int deg,int *a,int *b){
if(deg==) b[]=Pow(a[],P-,P);
else{
polyInv((deg+)>>,a,b);
int n=;
while(n< deg<<) n<<=;
copy(a,a+deg,c);
fill(c+deg,c+n,);
transform(c,,n);
transform(b,,n);
for(int i=;i<n;i++)
b[i]=(ll)b[i]*(-(ll)b[i]*c[i]%P+P)%P;
transform(b,-,n);
fill(b+deg,b+n,);
}
}
}fft;
int n,inv[N],invFac[N],poc[N],A[N],B[N],C[N];
void getInv(int n){
inv[]=invFac[]=;
for(int i=;i<=n;i++){
if(i!=) inv[i]=-(ll)P/i*inv[P%i]%P;
if(inv[i]<) inv[i]+=P;
invFac[i]=(ll)invFac[i-]*inv[i]%P;
}
}
int main(){
//freopen("in","r",stdin);
n=read();
fft.ini(n);
getInv(n); poc[]=poc[]=;
for(int i=;i<=n;i++) poc[i]=Pow(,(ll)i*(i-)>>%(P-),P);
for(int i=;i<=n;i++) B[i]=(ll)poc[i]*invFac[i]%P;
for(int i=;i<=n;i++) C[i]=(ll)poc[i]*invFac[i-]%P;//printf("CC %d\n",C[i]);
fft.polyInv(fft.n,B,A); fft.n<<=;
fft.transform(A,,fft.n);
fft.transform(C,,fft.n);
for(int i=;i<fft.n;i++) A[i]=(ll)A[i]*C[i]%P;//,printf("ABC %d %d %d\n",i,A[i],C[i]); fft.transform(A,-,fft.n);
printf("%lld",(ll)A[n]*Pow(invFac[n-],P-,P)%P);
}
BZOJ 3456: 城市规划 [多项式求逆元 DP]的更多相关文章
- BZOJ 3456: 城市规划 [多项式求逆元 组合数学 | 生成函数 多项式求ln]
3456: 城市规划 题意:n个点组成的无向连通图个数 以前做过,今天复习一下 令\(f[n]\)为n个点的无向连通图个数 n个点的完全图个数为\(2^{\binom{n}{2}}\) 和Bell数的 ...
- BZOJ 3456: 城市规划 多项式求逆
Description 刚刚解决完电力网络的问题, 阿狸又被领导的任务给难住了. 刚才说过, 阿狸的国家有n个城市, 现在国家需要在某些城市对之间建立一些贸易路线, 使得整个国家的任意两个城市都直接 ...
- bzoj 3456 城市规划 多项式求逆+分治FFT
城市规划 Time Limit: 40 Sec Memory Limit: 256 MBSubmit: 1091 Solved: 629[Submit][Status][Discuss] Desc ...
- BZOJ 3456 城市规划 (组合计数、DP、FFT)
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3456 著名的多项式练习题,做法也很多,终于切掉了纪念 首先求一波递推式: 令\(F(n ...
- bzoj 3456: 城市规划【NTT+多项式求逆】
参考:http://blog.miskcoo.com/2015/05/bzoj-3456 首先推出递推式(上面的blog讲的挺清楚的),大概过程是正难则反,设g为n个点的简单(无重边无自环)无向图数目 ...
- [BZOJ 3456]城市规划(cdq分治+FFT)
[BZOJ 3456]城市规划(cdq分治+FFT) 题面 求有标号n个点无向连通图数目. 分析 设\(f(i)\)表示\(i\)个点组成的无向连通图数量,\(g(i)\)表示\(i\)个点的图的数量 ...
- 51NOD 1258 序列求和 V4 [任意模数fft 多项式求逆元 伯努利数]
1258 序列求和 V4 题意:求\(S_m(n) = \sum_{i=1}^n i^m \mod 10^9+7\),多组数据,\(T \le 500, n \le 10^{18}, k \le 50 ...
- 多项式求逆元详解+模板 【洛谷P4238】多项式求逆
概述 多项式求逆元是一个非常重要的知识点,许多多项式操作都需要用到该算法,包括多项式取模,除法,开跟,求ln,求exp,快速幂.用快速傅里叶变换和倍增法可以在$O(n log n)$的时间复杂度下求出 ...
- BZOJ 3456: 城市规划 与 多项式求逆算法介绍(多项式求逆, dp)
题面 求有 \(n\) 个点的无向有标号连通图个数 . \((1 \le n \le 1.3 * 10^5)\) 题解 首先考虑 dp ... 直接算可行的方案数 , 容易算重复 . 我们用总方案数减 ...
随机推荐
- Dora.Interception, 为.NET Core度身打造的AOP框架[4]:演示几个典型应用
为了帮助大家更深刻地认识Dora.Interception,并更好地将它应用到你的项目中,我们通过如下几个简单的实例来演示几个常见的AOP应用在Dora.Interception下的实现.对于下面演示 ...
- JSP基础:JSP指令、JSP注释、JSP脚本、JSP声明、JSP表达式
JSP指令分为:page指令.include指令.taglib指令. page指令:通常位于JSP页面的顶端,同一个页面可以有多个页面指令. 语法:<%@ page language=" ...
- linux 树型显示文件 tree ls tree 命令
原创 2016年07月27日 09:50:19 yum install tree tree www │?? │?? │?? └── xml.test │?? │?? └── valgrind.su ...
- 解决DEDECMS Call to undefined function dede_htmlspecialchars()
作者:DEDECMS建站网 关注: 3610 时间:2015-11-18 16:39 内容详情 以下内容您可能感兴趣: 织梦官方在2015年6月18日更新了织梦5.7,为了兼容php5.4+,修改了/ ...
- Java数据结构和算法(十三)——哈希表
Hash表也称散列表,也有直接译作哈希表,Hash表是一种根据关键字值(key - value)而直接进行访问的数据结构.它基于数组,通过把关键字映射到数组的某个下标来加快查找速度,但是又和数组.链表 ...
- Html5+js测试题(开发版)
------------------------------------------------ 1. 谈谈你对js闭包的理解: 使用闭包主要是为了设计私有的方法和变量.闭包的优点是可以避免全局变量的 ...
- Java 运动模糊
Java 运动模糊代码 想用Java 写个运动模糊的效果,无奈本人水平有限,国内也没找到资源,于是Google到了一个文档,特地分享出来! 本代码源自 http://www.jhlabs.com/ip ...
- Visio绘制用例图问题集锦
1.Visio画UML用例图没有include关系的解决方法 发现Visio UML用例里面找不到include关系,即"箭头"+"<<include> ...
- linux workqueue的名字长度小问题
在排查一个nvme的的workqueue的问题的时候,发现nvme的queue的进程名被截断了, [root@localhost caq]# ps -ef |grep -i nvme root : ? ...
- 一个不可思议的MySQL慢查分析与解决
转自:http://fordba.com/optimize-an-amazing-mysql-slowlog.html?hmsr=toutiao.io&utm_medium=toutiao.i ...