bzoj 3456: 城市规划 (NTT+多项式求逆)
来源:互联网 发布:sql数据库软件下载 编辑:程序博客网 时间:2024/06/05 00:50
题目描述
传送门
题目大意:求n个点简单无向连通图数,其中任意点之间可以随意连边,不存在重边和自环。
题解
设
这个怎么理解呢?对于每一条边来说,有连与不连两种状态,但是这样直接计算会包含很多不连通的图。假设1所属的连通块内有i个点,那么满足该条件的不合法的图的数量就是
我们将上面的式子进行化简和变形:
然后等式两边同时除去
将含有
设
设
如果我们可以解出多项式
然后问题就变成了多项式求逆。
PS: 对于一个多项式
多项式的逆元
对于一个多项式
那么称
求解过程
现在考虑如何求
对于
假设在
再将
然后
两边平方
为啥是对的?哈
因为多项式在
然后同时两边同乘
将
这一步运算可以用NTT进行加速,所以最后的时间复杂度为
回到这道题,我们只需要用多项式求逆求出
得到最终的
代码
#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>#include<cmath>#define N 5000003#define LL long long#define p 1004535809using namespace std;int n,m;int a[N],b[N],c[N],jc[N],inv_j[N],wn[N];LL quickpow(LL num,LL x){ LL base=num%p; LL ans=1; while (x) { if (x&1) ans=ans*base%p; x>>=1; base=base*base%p; } return ans;}void init(){ jc[0]=1; inv_j[0]=quickpow(jc[0],p-2); for (int i=1;i<=n;i++) jc[i]=(LL)jc[i-1]*i%p,inv_j[i]=quickpow(jc[i],p-2); for (int i=1;i<=n*8;i<<=1) wn[i]=quickpow(3,(p-1)/(i<<1));}void NTT(int n,int *a,int opt){ for (int i=0,j=0;i<n;i++) { if (i>j) swap(a[i],a[j]); for (int l=n>>1;(j^=l)<l;l>>=1); } for (int i=1;i<n;i<<=1) { LL wn1=wn[i]; for (int p1=i<<1,j=0;j<n;j+=p1) { LL w=1; for (int k=0;k<i;k++,w=(LL)w*wn1%p) { int x=a[j+k]; int y=(LL)a[j+k+i]*w%p; a[j+k]=(x+y)%p; a[j+k+i]=(x-y+p)%p; } } } if (opt==-1) reverse(a+1,a+n);}void inverse(int n,int *a,int *b,int *c){ if (n==1) b[0]=quickpow(a[0],p-2); else { inverse((n+1)>>1,a,b,c); int k=0; for (k=1;k<=(n<<1);k<<=1); for (int i=0;i<n;i++) c[i]=a[i]; for (int i=n;i<k;i++) c[i]=0; NTT(k,c,1); NTT(k,b,1); for (int i=0;i<k;i++) { b[i]=(LL)(2-(LL)c[i]*b[i]%p)*b[i]%p; if (b[i]<0) b[i]+=p; } NTT(k,b,-1); int inv=quickpow(k,p-2); for (int i=0;i<k;i++) b[i]=(LL)b[i]*inv%p; for (int i=n;i<k;i++) b[i]=0; }}int main(){ freopen("a.in","r",stdin); freopen("my.out","w",stdout); scanf("%d",&n); init(); int n1=0; for (n1=1;n1<=n*2;n1<<=1); a[0]=1; for (int i=1;i<=n;i++) a[i]=(LL)quickpow(2,(LL)i*(i-1)/2)*inv_j[i]%p; inverse(n1,a,b,c); memset(c,0,sizeof(c)); for (int i=1;i<=n;i++) c[i]=(LL)quickpow(2,(LL)i*(i-1)/2)*inv_j[i-1]%p; NTT(n1,b,1); NTT(n1,c,1); for (int i=0;i<=n1;i++) b[i]=(LL)b[i]*c[i]%p; NTT(n1,b,-1); LL inv=quickpow(n1,p-2); for (int i=0;i<=n1;i++) b[i]=(LL)b[i]*inv%p; printf("%d\n",(LL)b[n]*jc[n-1]%p);}
- bzoj 3456: 城市规划 NTT+多项式求逆
- bzoj 3456: 城市规划 (NTT+多项式求逆)
- [生成函数][NTT][多项式求逆]BZOJ 3456: 城市规划
- BZOJ 3456 城市规划 多项式求ln
- [BZOJ3456]城市规划(组合数学+容斥原理+NTT+多项式求逆)
- bzoj3456/jzoj3303:城市规划(画柿子+多项式逆元+NTT)
- BZOJ 3456 城市规划 NTT 生成函数计数 ***
- [n点无向图个数 分治FFT || 多项式求逆] BZOJ 3456 城市规划
- 【多项式求逆】[BZOJ3456]城市规划
- [BZOJ3456] [多项式求逆] 城市规划
- bzoj3625(NTT+多项式求逆+多项式开根)
- [带标号无向连通图计数 容斥原理 多项式求逆 多项式求ln 模板题] BZOJ 3456 城市规划
- [BZOJ2259]异化多肽(生成函数+NTT+多项式求逆)
- NesCafe41 异化多肽 NTT实现多项式求逆
- bzoj-3456 城市规划
- BZOJ 3456 城市规划
- bzoj 3456 城市规划
- 【BZOJ3625】【CF438E】小朋友和二叉树 NTT 生成函数 多项式开根 多项式求逆
- sql 列转行
- 使用AS遇到Error:Connection timed out: connect. If you are behind an HTTP proxy, please configure the pro
- Laravel artisan 命令工具
- PHPExcel 进行Excel读取
- 了解JavaScript的执行上下文
- bzoj 3456: 城市规划 (NTT+多项式求逆)
- 基于@Aspect的AOP配置
- 全新的福昕JavaScript PDF阅读器
- php开发笔记(四)php数据类型及转换
- JDK 1.7 java.io 源码学习之ObjectInputStream和ObjectOutputStream
- C#认识/理解/运用 StreamReader,StreamWriter,StringReader,StreamWriter
- QQ在线客服代码(不需要加好友即可发起临时会话)
- Swift与OC混编
- 聚火群控系统