P4841 城市规划

题意

n个有标号点的简单(无重边无自环)无向连通图数目.

输入输出格式

输入格式:

仅一行一个整数\(n(\le 130000)\)

输出格式:

仅一行一个整数, 为方案数 \(\bmod 1004535809\).


设\(g_i\)表示\(i\)个点的图的数目,\(f_i\)表示\(i\)个点联通图的个数

\[g_n=f_n+\sum_{i=1}^{n-1}f_i\binom{n-1}{i-1}g^{n-i}
\]

意义是联通图+非联通图,关于非联通图的方案,枚举1号点所在联通块然后剩下的随意构图,不连通。

显然有\(g_n=2^{\binom{n}{2}}\),化简一波式子

\[\begin{aligned}
2^{\binom{n}{2}}&=\sum_{i=1}^nf_i\binom{n-1}{i-1}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)!}
\end{aligned}
\]

然后令

\[F(i)=\frac{f_i}{(i-1)!},G(i)=\frac{2^{\binom{i}{2}}}{(i-1)!},H(i)=\frac{2^{\binom{i}{2}}}{i!}
\]

显然有

\[G=F*H
\]

对\(H\)求个逆就可以了。

一些关于意义的边界问题可以试试,反正不是0就是1..

调这个题的时候因为把指数给膜了,挂了20年...


Code:

#include <cstdio>
#include <algorithm>
const int mod=1004535809,Gi=334845270;
const int N=(1<<20)+10;
#define mul(a,b) (1ll*(a)*(b)%mod)
#define add(a,b) ((a+b)%mod)
int fac[N],inv[N],A[N],B[N],t[2][N],G[N],H[N],turn[N],n,len,L;
int qp(int d,int k){int f=1;while(k){if(k&1)f=mul(f,d);d=mul(d,d),k>>=1;}return f;}
void NTT(int *a,int typ)
{
for(int i=1;i<len;i++) if(i<turn[i]) std::swap(a[i],a[turn[i]]);
for(int le=1;le<len;le<<=1)
{
int wn=qp(typ?3:Gi,(mod-1)/(le<<1));
for(int p=0;p<len;p+=le<<1)
{
int w=1;
for(int i=p;i<p+le;i++,w=mul(w,wn))
{
int tx=a[i],ty=mul(w,a[i+le]);
a[i]=add(tx,ty);
a[i+le]=add(tx,mod-ty);
}
}
}
if(!typ)
{
int inv=qp(len,mod-2);
for(int i=0;i<len;i++) a[i]=mul(a[i],inv);
}
}
void polymul(int *a,int *b)
{
for(int i=0;i<len;i++) A[i]=B[i]=0;
for(int i=0;i<len>>1;i++) A[i]=a[i],B[i]=b[i];
NTT(A,1),NTT(B,1);
for(int i=0;i<len;i++) A[i]=mul(A[i],B[i]);
NTT(A,0);
for(int i=0;i<len;i++) a[i]=A[i];
}
void init()
{
for(int i=1;i<len;i++) turn[i]=turn[i>>1]>>1|(i&1)<<L;
}
void polyinv(int *a,int n)
{
int cur=0;t[cur][0]=qp(a[0],mod-2);
len=1,L=-1;
while(len<=n<<2)
{
len<<=1,++L,cur^=1,init();
for(int i=0;i<len>>1;i++) t[cur][i]=add(t[cur^1][i],t[cur^1][i]);
polymul(t[cur^1],t[cur^1]);
polymul(t[cur^1],a);
for(int i=0;i<len;i++) t[cur][i]=add(t[cur][i],mod-t[cur^1][i]);
}
for(int i=0;i<=n;i++) a[i]=t[cur][i];
}
int main()
{
scanf("%d",&n);
fac[0]=1;for(int i=1;i<=n;i++) fac[i]=mul(fac[i-1],i);
inv[n]=qp(fac[n],mod-2);
for(int i=n-1;~i;i--) inv[i]=mul(inv[i+1],i+1);
for(int i=1;i<=n;i++) G[i]=mul(qp(2,1ll*i*(i-1)/2%(mod-1)),inv[i-1]);
for(int i=0;i<=n;i++) H[i]=mul(qp(2,1ll*i*(i-1)/2%(mod-1)),inv[i]);//这个mod-1调了本菜鸡20years
polyinv(H,n);
polymul(G,H);
printf("%d\n",mul(G[n],fac[n-1]));
return 0;
}

2018.12.26

洛谷 P4841 城市规划 解题报告的更多相关文章

  1. 洛谷 P2058 海港 解题报告

    P2058 海港 题目描述 小K是一个海港的海关工作人员,每天都有许多船只到达海港,船上通常有很多来自不同国家的乘客. 小K对这些到达海港的船只非常感兴趣,他按照时间记录下了到达海港的每一艘船只情况: ...

  2. 洛谷 P3956 棋盘 解题报告

    P3956 棋盘 题目描述 有一个\(m×m\)的棋盘,棋盘上每一个格子可能是红色.黄色或没有任何颜色的.你现在要从棋盘的最左上角走到棋盘的最右下角. 任何一个时刻,你所站在的位置必须是有颜色的(不能 ...

  3. 洛谷 P1979 华容道 解题报告

    P1979 华容道 题目描述 小\(B\)最近迷上了华容道,可是他总是要花很长的时间才能完成一次.于是,他想到用编程来完成华容道:给定一种局面, 华容道是否根本就无法完成,如果能完成, 最少需要多少时 ...

  4. BZOJ 3545 / 洛谷 P4197 Peaks 解题报告

    P4197 Peaks 题目描述 在\(\text{Bytemountains}\)有\(N\)座山峰,每座山峰有他的高度\(h_i\).有些山峰之间有双向道路相连,共\(M\)条路径,每条路径有一个 ...

  5. 虔诚的墓主人(BZOJ1227)(洛谷P2154)解题报告

    题目描述 小W是一片新造公墓的管理人.公墓可以看成一块N×M的矩形,矩形的每个格点,要么种着一棵常青树,要么是一块还没有归属的墓地. 当地的居民都是非常虔诚的基督徒,他们愿意提前为自己找一块合适墓地. ...

  6. 洛谷P4841 城市规划(生成函数 多项式求逆)

    题意 链接 Sol Orz yyb 一开始想的是直接设\(f_i\)表示\(i\)个点的无向联通图个数,枚举最后一个联通块转移,发现有一种情况转移不到... 正解是先设\(g(n)\)表示\(n\)个 ...

  7. 洛谷P4841 城市规划 [生成函数,NTT]

    传送门 题意简述:求\(n​\)个点的简单无向连通图的数量\(\mod \;1004535809​\),\(n \leq 130000​\) 经典好题呀!这里介绍两种做法:多项式求逆.多项式求对数 先 ...

  8. 洛谷 P2672 推销员 解题报告

    P2672 推销员 题目描述 阿明是一名推销员,他奉命到螺丝街推销他们公司的产品.螺丝街是一条死胡同,出口与入口是同一个,街道的一侧是围墙,另一侧是住户.螺丝街一共有N家住户,第i家住户到入口的距离为 ...

  9. 洛谷 P2679 子串 解题报告

    P2679 子串 题目描述 有两个仅包含小写英文字母的字符串\(A\)和\(B\). 现在要从字符串\(A\)中取出\(k\)个互不重叠的非空子串,然后把这\(k\)个子串按照其在字符串\(A\)中出 ...

随机推荐

  1. 树上三角形 BZOJ3251

    分析: 模拟赛T3,其实很水,当时出于某些原因,没有去写这道题... len>46必定有解 为了满足不是三角形,那么斐波那契数列是最优选择,而斐波那契数列的第46项超过了2^31-1,所以超过4 ...

  2. 使用jdb调试apk

    jdb是一个支持java代码级调试的工具,它是由java jdk提供的,存在于xxx\Java\jdk1.6.0_21\bin之下 使用ddms调试时,主机会打开另外一个网络端口,在DDMS里查看,一 ...

  3. 20155305《网络对抗》PC平台逆向破解(二)

    20155305<网络对抗>PC平台逆向破解(二) shellcode注入 1.shellcode shellcode是一段代码,溢出后,执行这段代码能开启系统shell. 2.构造方法 ...

  4. vs编译器好多下划波浪线但不报错

    解决办法:项目属性->c/c++->常规->附加包含目录->$(ProjectDir): $(ProjectDir) 项目的目录(定义形式:驱动器 + 路径):包括尾部的反斜杠 ...

  5. Spring+SpringMVC+MyBatis整合优化篇

    优化篇 Spring+SpringMVC+MyBatis+easyUI整合优化篇(一)System.out.print与Log Spring+SpringMVC+MyBatis+easyUI整合优化篇 ...

  6. 如何在Windows Server 2003搭建Windows+iis+asp+access环境

    前提系统盘镜像要加载进来方案一:开始->管理您的服务器->添加或删除角色->下一步->自定义配置->下一步->选择应用程序服务器(IIS,ASP.NET)-> ...

  7. 英特尔和 Valve* 将英特尔® Embree 光线追踪技术添加至全新 Steam* Audio 插件

    本文从英特尔® Embree 光线追踪技术着手,深入探讨英特尔与 Valve 合作带来的优势:一方面,开发人员使用英特尔高度优化的库创建场景,可以显著加快编译速度:另一方面,逼真的声效可以增强游戏性, ...

  8. React笔记-首次渲染

    渲染机制 渲染机制主要分为两部分: 首次渲染和更新渲染. 首次渲染 首先通过一个小例子,来讲解首次渲染过程. <!DOCTYPE html> <html lang="en& ...

  9. Pi Zero三代版本演化比较

    本文介绍Pi Zero的版本演进. 5美元的Pi Zero一上市即造成轰动! 2015年11月树莓派基金会发表了只有5美元的树莓派计算机:PiZero,且只要购买纸本的第40期MagPi杂志就可以附送 ...

  10. hyperledger-fabirc1.2-ca-server的生产示例

    hyperledger-fabirc1.2-ca-server的生产示例,带TLS 在fabirc-samples/first-network中启动网络,其ca证书是利用crypto的工具生成的,但是 ...