正题

题目链接:https://www.luogu.org/problemnew/show/P4841


题目大意

求nnn个点的简单联通无向图的个数。


解题思路

首先考虑n2n^2n2,我们设gig_igi​表示iii个点的简单无向图的个数,显然gi=2n(n−1)2g_i=2^{\frac{n(n-1)}{2}}gi​=22n(n−1)​

然后我们设fif_ifi​表示iii个点的简单无向联通图的个数,然后我们只要固定一个联通块大小为k(k<i)k(k<i)k(k<i)然后剩下的点都不与其联通就可以去掉不连通的。

也就是fn=gn−∑i=1n−1fi∗Cn−1i−1∗gn−if_n=g_n-\sum_{i=1}^{n-1}f_i*C_{n-1}^{i-1}*g_{n-i}fn​=gn​−i=1∑n−1​fi​∗Cn−1i−1​∗gn−i​

这就是O(n2)O(n^2)O(n2)

之后我们考虑优化,将CCC拆开
fn=gn−∑i=1n−1fi∗(i−1)!(n−i)!(i−1)!∗gn−if_n=g_n-\sum_{i=1}^{n-1}f_i*\frac{(i-1)!}{(n-i)!(i-1)!}*g_{n-i}fn​=gn​−i=1∑n−1​fi​∗(n−i)!(i−1)!(i−1)!​∗gn−i​
然后将nnn的项提出
fn=gn−∑i=1n−1fi∗(n−1)!(n−i)!(i−1)!∗gn−if_n=g_n-\sum_{i=1}^{n-1}f_i*\frac{(n-1)!}{(n-i)!(i-1)!}*g_{n-i}fn​=gn​−i=1∑n−1​fi​∗(n−i)!(i−1)!(n−1)!​∗gn−i​
gn(n−1)!=∑i=1nfi(i−1)!gn−i(n−i)!\frac{g_n}{(n-1)!}=\sum_{i=1}^n\frac{f_i}{(i-1)!}\frac{g_{n-i}}{(n-i)!}(n−1)!gn​​=i=1∑n​(i−1)!fi​​(n−i)!gn−i​​
然后使用NTTNTTNTT卷起来
F(x)=∑i=1+∞fi(i−1)!xiF(x)=\sum_{i=1}^{+\infty}\frac{f_i}{(i-1)!}x^iF(x)=i=1∑+∞​(i−1)!fi​​xi
G(x)=∑i=0+∞gn−i(n−i)!xiG(x)=\sum_{i=0}^{+\infty}\frac{g_{n-i}}{(n-i)!}x^iG(x)=i=0∑+∞​(n−i)!gn−i​​xi
H(x)=∑n=1+∞gn(n−1)!xnH(x)=\sum_{n=1}^{+\infty}\frac{g_n}{(n-1)!}x^nH(x)=n=1∑+∞​(n−1)!gn​​xn
上两个的iii与最后一个的nnn同理,所以现在有
H(x)=F(x)G(x)H(x)=F(x)G(x)H(x)=F(x)G(x)
F(x)=H(x)G(x)−1F(x)=H(x)G(x)^{-1}F(x)=H(x)G(x)−1
现在我们要求F(x)F(x)F(x)而H(x)H(x)H(x)和G(x)G(x)G(x)都知道。

那么我们将G(x)G(x)G(x)进行求逆后用NTTNTTNTT与H(x)H(x)H(x)相乘就好了。


codecodecode

#include<cstdio>
#include<algorithm>
#include<cstring>
#define ll long long
using namespace std;
const ll N=131000,XJQ=1004535809;
ll n,fac[N],inv[N],r[N*4],Gi;
ll power(ll x,ll b)
{ll ans=1;while(b){if(b&1) ans=ans*x%XJQ;x=x*x%XJQ;b>>=1;}return ans;
}
struct Poly{ll x[N*4];void cpy(Poly &a,ll len){for(ll i=0;i<len;i++)x[i]=a.x[i];}void reset(ll len){for(ll i=0;i<len;i++)x[i]=0;}void ntt(ll n,ll op){for(ll i=1;i<n;i++)r[i]=(r[i>>1]>>1)|((i&1)?n>>1:0);for(ll i=0;i<n;i++)if(i<r[i])swap(x[i],x[r[i]]);for(ll p=2;p<=n;p<<=1){ll len=p>>1,tmp=power(3,(XJQ-1)/p);if(op==-1)tmp=power(tmp,XJQ-2);for(ll k=0;k<n;k+=p){ll buf=1;for(ll i=k;i<k+len;i++){ll tt=buf*x[len+i]%XJQ;x[len+i]=(x[i]-tt+XJQ)%XJQ;x[i]=(x[i]+tt)%XJQ;buf=buf*tmp%XJQ;}}}}
};
Poly get_inv(Poly &a,Poly &b,Poly &c,ll n){if(a.x[0]==1) b.x[0]=1;else b.x[0]=power(a.x[0],XJQ-2);for(ll w=1;(1<<(w-1))<n;++w){ll len=(1<<w);c.cpy(a,len);c.ntt(len*2,1);b.ntt(len*2,1);for(ll i=0;i<(len<<1);i++)b.x[i]=(2-b.x[i]*c.x[i]%XJQ+XJQ)*b.x[i]%XJQ;b.ntt(len*2,-1);ll inv=power(len*2,XJQ-2);for(ll i=0;i<len;i++)b.x[i]=b.x[i]*inv%XJQ;for(ll i=len;i<len*2;i++) b.x[i]=0;}return b;
}
Poly H,Ginv,a,b;
int main()
{scanf("%lld",&n);n++;fac[0]=fac[1]=inv[0]=inv[1]=1;for(ll i=2;i<=n;i++){inv[i]=XJQ-(XJQ/i)*inv[XJQ%i]%XJQ;fac[i]=fac[i-1]*inv[i]%XJQ;}Ginv.x[0]=1;for(ll i=1;i<n;i++){ll tmp=power(2,i*(i-1)/2%(XJQ-1));H.x[i]=tmp*fac[i-1]%XJQ,Ginv.x[i]=tmp*fac[i]%XJQ;}Ginv=get_inv(Ginv,a,b,n);ll len=1,w=0;while(len<(n<<1)) len<<=1,w++;for(ll i=n;i<len;i++) Ginv.x[i]=0;H.ntt(len,1);Ginv.ntt(len,1);for(ll i=0;i<=len;i++)H.x[i]=H.x[i]*Ginv.x[i]%XJQ;H.ntt(len,-1);printf("%lld",power(inv[2],w)*H.x[n-1]%XJQ*power(fac[n-2],XJQ-2)%XJQ);
}

P4841,jzoj3303-城市规划【NTT,多项式求逆,dp】相关推荐

  1. P4233-射命丸文的笔记【NTT,多项式求逆】

    正题 题目链接:https://www.luogu.com.cn/problem/P4233 题目大意 随机选择一条有哈密顿回路的nnn个点的竞赛图,求选出图的哈密顿回路的期望个数. 对于每个n∈[1 ...

  2. 【BZOJ】3456: 城市规划 动态规划+多项式求逆

    [题意]求n个点的带标号无向连通图个数 mod 1004535809.n<=130000. [算法]动态规划+多项式求逆 [题解]设$g_n$表示n个点的无向图个数,那么显然 $$g_n=2^{ ...

  3. bzoj 3456: 城市规划【NTT+多项式求逆】

    参考:http://blog.miskcoo.com/2015/05/bzoj-3456 首先推出递推式(上面的blog讲的挺清楚的),大概过程是正难则反,设g为n个点的简单(无重边无自环)无向图数目 ...

  4. 洛谷P4841 城市规划(多项式求逆)

    传送门 这题太珂怕了--如果是我的话完全想不出来-- 题解 1 //minamoto 2 #include<iostream> 3 #include<cstdio> 4 #in ...

  5. Luogu4725 【模板】多项式对数函数(NTT+多项式求逆)

    https://www.cnblogs.com/HocRiser/p/8207295.html 安利! #include<iostream> #include<cstdio> ...

  6. 多项式算法5:多项式求逆

    多项式算法5:多项式求逆 多项式求逆 前置知识: FFT NTT 多项式求逆 这里的多项式求逆,其实是求多项式的逆元. 对于多项式A(x)A(x)A(x),如果存在A(x)B(x)≡1(modxn)A ...

  7. (每日一题)P4841 [集训队作业2013]城市规划 (无向连通图计数)(普通生成函数 + 多项式求逆)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 每日一题(莫反 / 多项式 / 母函数 / 群论) 2021.4.14 生成函数 + 多项式求逆 Pr ...

  8. BZOJ 3456: 城市规划(dp+多项式求逆)

    传送门 解题思路 这道题就是求带标号的无向连通图个数,首先考虑\(O(n^2)\)的做法,设\(f_i\)表示有\(i\)个节点的无向连通图个数,那么考虑容斥,先把所有的无向图求出,即为\(2^{C( ...

  9. #3456. 城市规划(生成函数,多项式求逆)

    #3456. 城市规划 设fnf_nfn​为nnn个点的的点的简单无向连通图数目,gng_ngn​为nnn个点的简单无向图个数(不要求联通). 对于gng_ngn​显然有gn=2n(n−1)2g_n ...

最新文章

  1. 【OpenCV】内核的形状函数使用记录
  2. windows 如何使用4GB(开启3GB和PAE)
  3. python(1):数据类型/string/list/dict/set等
  4. 重庆大学校友会计算机,资环学院联谊会隆重举行
  5. ubutnu 下SVN 提交时忽略某些文件或文件夹
  6. 开源APM系统skywalking介绍与使用
  7. jQuery .tmpl(), .template()学习
  8. sql视图 权限_SQLmysql用户权限管理
  9. maven netty 配置_Netty是业界最流行的NIO框架之一:初识Netty
  10. 程序员如何帮助公司快速上市、获得分红?
  11. WebGL多模型光照综合实例
  12. Guava库学习:学习Concurrency(二)Monitor_2
  13. html css 博客园,分享几个博客园代码样式的CSS配置(复制黏贴即可)
  14. AutoCAD2006安装破解图文教程
  15. html全屏轮播图插件,js全屏banner图片轮播插件
  16. 麻省理工学院公开课:信号与系统:模拟与数字信号处理 调幅演示
  17. 盘点百度 4 个牛逼哄哄的开源项目
  18. Android版优酷网闪亮登场
  19. 【财务分析】ERP软件的财务管理系统具有哪些功能?
  20. 矩阵分解 (乘法篇)

热门文章

  1. 重力模型matlab代码,STK基础教程.doc
  2. 筛选装置用c语言编程,一种空壳瓜子筛选装置的制作方法
  3. 机器学习之乳腺癌问题(SVM)
  4. 数据结构——从叶子结点到根节点的全部路径
  5. leetcode209. 长度最小的子数组(滑动窗口)
  6. leetcode674. 最长连续递增序列
  7. 计算机检测维修与数据恢复课件,2017年全国职业院校技能大赛中职组“计算机检测维修与数据恢复”赛项说明会ppt课件.ppt...
  8. Java实现AVL平衡树
  9. 根据二叉树的先序和中序求后序遍历
  10. C++ struct实现顺序表