http://www.lydsy.com/JudgeOnline/problem.php?id=3456

题意:求n个点的无向连通图的方案。(n<=130000)

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=130050, fN=N<<2;
const ll mo=1004535809;
ll G[35], nG[35];
int rev[fN];
ll ipow(ll a, int b) { ll x=1; for(; b; b>>=1, (a*=a)%=mo) if(b&1) (x*=a)%=mo; return x; }
void fft(ll *a, int n, int f) {
for(int i=0; i<n; ++i) if(i<rev[i]) swap(a[i], a[rev[i]]);
int now=-1;
for(int m=2; m<=n; m<<=1) {
int mid=m>>1; ++now;
ll wn=G[now]; if(f) wn=nG[now];
for(int i=0; i<n; i+=m) {
ll w=1;
for(int j=0; j<mid; ++j) {
ll u=a[i+j], v=a[i+j+mid]*w%mo;
a[i+j]=(u+v)%mo;
a[i+j+mid]=(u-v+mo)%mo;
(w*=wn)%=mo;
}
}
}
}
ll tmp[fN];
void getinv(ll *A, ll *B, int n) {
if(n==1) { B[0]=ipow(A[0], mo-2); return; }
getinv(A, B, (n+1)>>1);
int len=1, bl=-1, nn=(n<<1)-1;
for(; len<nn; len<<=1, ++bl);
for(int i=1; i<len; ++i) rev[i]=(rev[i>>1]>>1)|(((ll)i&1)<<bl);
for(int i=0; i<n; ++i) tmp[i]=A[i]; for(int i=n; i<len; ++i) tmp[i]=0;
fft(tmp, len, 0); fft(B, len, 0);
for(int i=0; i<len; ++i) B[i]=B[i]*((2-tmp[i]*B[i]%mo+mo)%mo)%mo;
fft(B, len, 1); ll nN=ipow(len, mo-2);
for(int i=0; i<n; ++i) (B[i]*=nN)%=mo; for(int i=n; i<len; ++i) B[i]=0;
}
ll ni[N], p[N], A[fN], B[fN], nA[fN];
int main() {
int n;
scanf("%d", &n);
if(n<=2) { puts("1"); return 0; } int len=1, bl=-1, nn=((n+1)<<1)-1;
for(; len<nn; len<<=1, ++bl);
G[bl]=ipow(3, (mo-1)/len); nG[bl]=ipow(G[bl], mo-2);
for(int i=bl-1; i>=0; --i) G[i]=G[i+1]*G[i+1]%mo, nG[i]=nG[i+1]*nG[i+1]%mo;
ni[1]=1; p[1]=1; p[0]=1;
for(int i=2; i<=n; ++i) ni[i]=((-(mo/i)*ni[mo%i])%mo+mo)%mo;
for(int i=2; i<=n; ++i) p[i]=p[i-1]*ni[i]%mo;
A[0]=1, B[0]=0;
ll last=1, C=1;
for(int i=1; i<=n; ++i) A[i]=last*p[i]%mo, B[i]=last*p[i-1]%mo, last=last*((C<<=1)%=mo)%mo;
getinv(A, nA, n+1);
for(int i=1; i<len; ++i) rev[i]=(rev[i>>1]>>1)|(((ll)i&1)<<bl);
fft(nA, len, 0); fft(B, len, 0);
for(int i=0; i<len; ++i) (B[i]*=nA[i])%=mo;
fft(B, len, 1); ll nN=ipow(len, mo-2);
for(int i=0; i<=n; ++i) (B[i]*=nN)%=mo;
ll pp=1;
for(int i=2; i<=n; ++i) (pp*=(i-1))%=mo, (B[i]*=pp)%=mo;
printf("%lld\n", B[n]);
return 0;
}

  

理论知识请orz:http://picks.logdown.com/posts/189620-inverse-element-of-polynomial

妈呀多项式除法好多地方我都写跪了555调了好久555

fnt就是用原根来替换单位根,条件是显然的,即:$2^k | (mo-1)$, $2^k>=n$,很容易得到$g^{\frac{mo-1}{m}} \pmod { mo }$可以替换fft中的复数根= =

证明就不证啦= =你可以对着算导证= =(很简单的辣= =。可是

fnt如何求逆?其实也很简单辣= =根是$n^{-1}g^{-\frac{mo-1}{m}}$,这个逆矩阵也是同复数根一样的证法

然后各种乱搞就行辣= =

至于多项式求逆,如果想到倍增也是很显然的...一下就能推出来辣= =(不会的就来问我辣= =qq在右边。。欢迎辣

那么回到本题,容易得到

$$f(n) = 2^{\binom{n}{2}} - \sum_{i=1}^{n-1} 2^{\binom{n-i}{2}} \binom{n-1}{i-1} f(i)$$

意义很显然,所有的图减去不连通的图(这里的技巧太牛了,先取出一个点枚举这个点所在的连通块即$f(i)$,而我们可以选择$\binom{n-1}{i-1}$种点与这个点在一个连通块内,然后剩下的就是随便生成图即$2^{\binom{n-i}{2}}$,乘起来就好辣)

其实这里很不好搞的,我们需要强行化简!

发现$f(i), i<n$都在和式里,而移项后偏偏$f(n)$不在!是不是很不爽!于是去跪picks和jry!发现我们只需要左右都乘上一个$(n-1)!^{-1}$就行辣!就能提$f(n)$进和式辣!即:

$$\sum_{i=0}^{n} 2^{\binom{n-i}{2}} (n-i)!^{-1} (i-1)!^{-1} f(i) = 2^{\binom{n}{2}} (n-1)!^{-1}$$

然后容易发现只要设多项式

$$
\begin{align}
A & = 2^{\binom{i}{2}} i!^{-1} x^i \\
B & = (i-1)!^{-1} f(i) x^i \\
C & = 2^{\binom{i}{2}} (i-1)!^{-1} x^i \\
\end{align}
$$

原式就是$AB=C$辣。(后边是我的错误= =本来就是不能放入$A$的= =感谢zrt神犇指出(在这里,为啥不将$(i-1)!^{-1}$放进$A$是有原因的555,一开始我放到了$A$就一直跪跪跪!因为这样的话$A[0]=0$那么模任何多项式$x^i$都没有关于$A$的逆元!!!妈妈压QAQ!

然后就是$B=CA^{-1}$就是裸的除法辣= =对$A$模一下$x^{n+1}$即可

【BZOJ】3456: 城市规划的更多相关文章

  1. [BZOJ 3456]城市规划(cdq分治+FFT)

    [BZOJ 3456]城市规划(cdq分治+FFT) 题面 求有标号n个点无向连通图数目. 分析 设\(f(i)\)表示\(i\)个点组成的无向连通图数量,\(g(i)\)表示\(i\)个点的图的数量 ...

  2. BZOJ 3456: 城市规划 [多项式求逆元 组合数学 | 生成函数 多项式求ln]

    3456: 城市规划 题意:n个点组成的无向连通图个数 以前做过,今天复习一下 令\(f[n]\)为n个点的无向连通图个数 n个点的完全图个数为\(2^{\binom{n}{2}}\) 和Bell数的 ...

  3. [BZOJ 3456]城市规划

    Description 题库链接( bzoj 权限题,可以去 cogs 交♂ 题库链接2 求含有 \(n\) 个点有标号的简单无向联通图的个数.方案数对 \(1004535809(479\times ...

  4. BZOJ 3456: 城市规划 与 多项式求逆算法介绍(多项式求逆, dp)

    题面 求有 \(n\) 个点的无向有标号连通图个数 . \((1 \le n \le 1.3 * 10^5)\) 题解 首先考虑 dp ... 直接算可行的方案数 , 容易算重复 . 我们用总方案数减 ...

  5. bzoj 3456 城市规划——分治FFT / 多项式求逆 / 多项式求ln

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3456 分治FFT: 设 dp[ i ] 表示 i 个点时连通的方案数. 考虑算补集:连通的方 ...

  6. bzoj 3456 城市规划 多项式求逆+分治FFT

    城市规划 Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 1091  Solved: 629[Submit][Status][Discuss] Desc ...

  7. bzoj 3456 城市规划 —— 分治FFT / 多项式求逆 / 指数型生成函数(多项式求ln)

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3456 首先考虑DP做法,正难则反,考虑所有情况减去不连通的情况: 而不连通的情况就是那个经典 ...

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

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3456 题意: 求出\(n\)个点的简单(无重边无自环)无向连通图的个数.(\(n< ...

  9. BZOJ 3456 城市规划 (组合计数、DP、FFT)

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3456 著名的多项式练习题,做法也很多,终于切掉了纪念 首先求一波递推式: 令\(F(n ...

  10. BZOJ 3456: 城市规划 [多项式求逆元 DP]

    题意: 求出n个点的简单(无重边无自环)无向连通图数目.方案数mod 1004535809(479 * 2 ^ 21 + 1)即可. n<=130000 DP求方案 g(n) n个点所有图的方案 ...

随机推荐

  1. 在ubuntu上搭建开发环境1---在windows7的基础上在安装ubuntu(双系统)

    转载:http://jingyan.baidu.com/article/60ccbceb18624464cab197ea.html 当需要频繁使用ubuntu时,vmware虚拟机下运行ubuntu, ...

  2. Pyqt QSS简单的Ui美化

    什么是QSS QSS 是Qt StyleSheet 的简称,意思就是qt的样式表格,StyleSheet 可以像CSS一样的写样式.使页面美化跟代码层分开,利于维护. QSS的语法 同css一样,他也 ...

  3. 解决mysql无法插入中文数据及插入后显示乱码的问题

    (1)废话不多说就是使用mysql数据库的时候无法输入中文,可以输入中文后显示的又是乱码!! (2开始解决问题: 第一步:找到安装mysql的目录找到 my.ini 文件: 第二步:使用记事本打开my ...

  4. Oracle12c client安裝報錯[INS-20802] Oracle Net Configuration Assistant failed完美解決

    Doc ID 2082662.1 1.錯誤碼 Installation Of Oracle Client 12.1.0.2.0 (32-bit) Fails With An Error Message ...

  5. HR外包系统 - 客户公司薪资规则 报表需求 记入系统

    1 薪酬规则,包括 常用薪资项目 2 报表需求,特别是报表排序规则 3 特殊项说明记录 另外包括客户公司监控的日期设置

  6. 在Asp.Net MVC中设定site路径所对应的默认action

    设置路由的default的Controller和Action可以达到我们预期的效果,代码如下所示: public class RouteConfig { public static void Regi ...

  7. 【项目经验】——JSON.parse() && JSON.stringify()

    我们在做项目的时候,都知道序列化和反序列化,师哥说:"有正就有反,有来就有回!"的确,就是这样.然后我们在这里分享一下JSON.stringify()  和JSON.parse() ...

  8. Java可变参数讲解

    如果实现的多个方法,这些方法里面逻辑基本相同,唯一不同的是传递的参数的个数,可以使用可变参数可变参数的定义方法 数据类型...数组的名称,这个数组存储传递过来的参数,类似JavaScript注意点:  ...

  9. 【JS】两种计时器/定时器

    1.首先介绍定时器 定时器:设置一个定时器,再设置一个等待的时间,到达指定时间后,执行对应的操作 两种定时器:用法一样,区别一个执行后不会停下来,一个只执行一次 第一种:window.setInter ...

  10. HDU 4496 D-City (并查集)

    题意:有n个城市,m条路,首先m条路都连上,接着输出m行,第i行代表删除前i行的得到的连通块个数 题解:正难则反,我们反向考虑使用并查集添边.首先每个点都没有相连,接着倒着来边添加边计算,当两个点父节 ...