題目大意

求出有n个点的有标号简单连通无向图的数目。

题解

什么破玩意,直接输出\(2^{C_n^2}\)走人

我们发现这张图要求连通,而上式肯定不能保证连通。

其实上式表示的是不保证连通的有标号简单无向图。

就差在一个连通上啊。

所以我们设\(f(x)\)表示有x个点的有标号简单连通无向图的数目。

然后设\(g(x)\)为上式,即不保证连通时的方案数

于是我们枚举节点1所在的连通块的大小,有

\[g(n) = \sum_{i=1}^nC_{n-1}^{i-1}f(i)g(n-1)
\]

\[\frac{g(n)}{(n-1)!} = \frac{\sum_{i=1}^nC_{n-1}^{i-1}f(i)g(n-1)}{(n-1)!}
\]

\[\frac{2^{C_n^2}}{(n-1)!} = \sum_{i=1}{n}\frac{f(i)}{(i-1)!}\frac{2^{C_{n-i}^2}}{(n-i)!}
\]

那么我们分别设它们的生成函数为

\[A(x) = \sum_{n=1}^{\infty}\frac{f(n)}{(n-1)!}x^n
\]

\[B(x) = \sum_{n=0}^{\infty}\frac{2^{C_n^2}}{n!}x^n
\]

\[C(x) = \sum_{n=0}^{\infty}\frac{2^{C_n^2}}{(n-1)!}x^n
\]

所以我们有

\[C(x) = A(x)B(x)
\]

那么有

\[A(x) \equiv B^{-1}(x)C(x) (mod\text{ }x^{n+1})
\]

所以利用FFT算逆元,处理乘法即可.

//这里用的FNT,即快速数论变换.

#include <cmath>
#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long ll;
inline void read(int &x){
x=0;char ch;bool flag = false;
while(ch=getchar(),ch<'!');if(ch == '-') ch=getchar(),flag = true;
while(x=10*x+ch-'0',ch=getchar(),ch>'!');if(flag) x=-x;
}
const int maxn = 1 << 18;
const int mod = 1004535809;
const int pri_rt = 3;
inline int qpow(int x,int p){
int ret = 1;
for(;p;x=1LL*x*x%mod,p>>=1) if(p&1) ret=1LL*ret*x%mod;
return ret;
}
int len;
int e[maxn],ie[maxn];
inline int check(int &x){
if(x < 0) x += mod;
if(x >= mod) x -= mod;
}
inline void init(){
int bas = qpow(pri_rt,(mod-1)/len);
int inv = qpow(bas,mod-2);
e[0] = ie[0] = 1;
for(int i=1;i<len;++i){
e[i] = 1LL*e[i-1]*bas % mod;
ie[i] = 1LL*ie[i-1]*inv % mod;
}
}
void FNT(int n,int *x,int *w){
for(int i=0,t=0;i<n;++i){
if(i > t) swap(x[i],x[t]);
for(int j=n>>1;(t^=j) < j;j>>=1);
}
for(int m=2;m<=n;m<<=1){
int k = m>>1,wn = len/m;
for(int i=0;i<n;i+=m){
for(int j=0,p=0;j<k;++j,p+=wn){
int u = 1LL*x[i+j+k]*w[p] % mod;
x[i+j+k] = x[i+j] - u;check(x[i+j+k]);
x[i+j] = x[i+j] + u;check(x[i+j]);
}
}
}
if(w == ie){
int inv = qpow(n,mod-2);
for(int i=0;i<n;++i) x[i] = 1LL*x[i]*inv%mod;
}
}
struct Node{
int n;
int x[maxn];
Node(){n = x[0] = 0;}
};
void get_inv(int n,const Node &A,Node &B){
if(n == 1){
B.n = 1;
B.x[0] = qpow(A.x[0],mod-2);
return;
}
static int X[maxn];
get_inv((n+1)>>1,A,B);
int p = 1;for(;p < n<<1 ;p<<=1);
copy(A.x,A.x+n,X);fill(X+n,X+p,0);
fill(B.x+B.n,B.x+p,0);
FNT(p,X,e);FNT(p,B.x,e);
for(int i=0;i<p;++i) B.x[i] = 1LL*B.x[i]*(2 - 1LL*X[i]*B.x[i] % mod) % mod;
FNT(p,B.x,ie);B.n = n;
}
Node A,B,C;
int inv[maxn],inv_fac[maxn],c[maxn];
int main(){
int n;read(n);
int p;for(p=1;p<(n+1)<<1;p<<=1);
len = p;init();
inv[1] = inv_fac[0] = 1;
for(int i=1;i<=n;++i){
if(i != 1) inv[i] = -mod/i*(ll)inv[mod % i] % mod;
if(inv[i] < 0) inv[i] += mod;
inv_fac[i] = (ll)inv_fac[i-1]*inv[i]%mod;
}
c[0] = c[1] = 1;
for(int i=2;i<=n;++i) c[i] = qpow(2,(ll)i*(i-1)/2 % (mod - 1));
A.n = B.n = n+1;
for(int i=0;i<=n;++i) A.x[i] = (ll)c[i]*inv_fac[i] % mod;
for(int i=1;i<=n;++i) B.x[i] = (ll)c[i]*inv_fac[i-1]%mod;
get_inv(n+1,A,C);
fill(C.x + C.n,C.x + p,0);
FNT(p,C.x,e);FNT(p,B.x,e);
for(int i=0;i<=p;++i) C.x[i] = (ll)C.x[i]*B.x[i] % mod;
FNT(p,C.x,ie);
int ans = (ll)C.x[n]*qpow(inv_fac[n-1],mod - 2) % mod;
if(ans < 0) ans += mod;
printf("%d\n",ans);
getchar();getchar();
return 0;
}

bzoj3456城市规划 多项式取模的更多相关文章

  1. Luogu3824 [NOI2017]泳池 【多项式取模】【递推】【矩阵快速幂】

    题目分析: 用数论分块的思想,就会发现其实就是连续一段的长度$i$的高度不能超过$\lfloor \frac{k}{i} \rfloor$,然后我们会发现最长的非$0$一段不会超过$k$,所以我们可以 ...

  2. 【BZOJ4944】【NOI2017】泳池 概率DP 常系数线性递推 特征多项式 多项式取模

    题目大意 有一个\(1001\times n\)的的网格,每个格子有\(q\)的概率是安全的,\(1-q\)的概率是危险的. 定义一个矩形是合法的当且仅当: 这个矩形中每个格子都是安全的 必须紧贴网格 ...

  3. 洛谷P4723 【模板】线性递推(多项式取模 线性代数)

    题意 题目链接 Sol Orz shadowice 注意,下面的代码自带O(随时TLE)倍大常数.. #include<bits/stdc++.h> #define Pair pair&l ...

  4. bzoj3456 城市规划 多项式求In

    \(n\)个点的无向联通图的个数 打着好累啊 一定要封装一个板子 记\(C(x)\)为无向图个数的指数型生成函数,\(C(0) = 1\) 记\(G(x)\)为无向联通图个数的指数型生成函数,\(G( ...

  5. 【learning】多项式相关(求逆、开根、除法、取模)

    (首先要%miskcoo,这位dalao写的博客(这里)实在是太强啦qwq大部分多项式相关的知识都是从这位dalao博客里面学的,下面这篇东西是自己对其博客学习后的一些总结和想法,大部分是按照其博客里 ...

  6. 2019.01.03 bzoj3456: 城市规划(生成函数+多项式取对)

    传送门 生成函数好题. 题意:求n个点的简单(无重边无自环)无向连通图数目 思路: 对简单无向图构造生成函数f(x)=∑n2Cn2xnn!f(x)=\sum_n2^{C_n^2}\frac{x^n}{ ...

  7. Re.多项式除法/取模

    前言 emmm又是暂无 前置 多项式求逆 多项式除法/取模目的 还是跟之前一样顾名思义] 给定一个多项式F(x),请求出多项式Q(x)和R(x),满足F(x)=Q(x)∗G(x)+R(x),R项数小于 ...

  8. 位运算之——按位与(&)操作——(快速取模算法)

    学习redis 字典结构,hash找槽位 求槽位的索引值时,用到了 hash值 & sizemask操作, 其后的scan操作涉及扫描顺序逻辑,对同模的槽位 按一定规则扫描! 其中涉及位运算 ...

  9. 【Java基础】14、位运算之——按位与(&)操作——(快速取模算法)

    学习redis 字典结构,hash找槽位 求槽位的索引值时,用到了 hash值 & sizemask操作, 其后的scan操作涉及扫描顺序逻辑,对同模的槽位 按一定规则扫描! 其中涉及位运算 ...

随机推荐

  1. nginx 代理模式下,获取客户端真实IP

    最近做博友推荐,发现个小问题,用$_SERVER['REMOTE_ADDR'];得到的都是服务器的地址192.168.96.52,搜索了一下,发现问题,改为$_SERVER['HTTP_X_REAL_ ...

  2. openssl源码安装

    下载最新的OpenSSL http://openssl.org/source/ ./config    make  make install 通过命令openssl version或者openssl ...

  3. 转载 ----Android学习笔记 - 蓝牙篇 (Bluetooth)

      1.什么是蓝牙  Bluetooth是目前使用的最广泛的无线通讯协议之一  主要针对短距离设备通讯(10米)  常用于连接耳机.鼠标和移动通讯设备等 2.发现周围蓝牙设备  BluetoothAd ...

  4. activemq 安装-单点

    一,准备工作:首先安装jdk1.7及其以上版本,此环境安装的是jdk-1.8   二.搭建activemq 环境:  192.168.9.25         centos6.5            ...

  5. EasyNVR H5无插件摄像机直播解决方案前端解析之:如何在播放界面添加实时云台控制界面

    如何在播放器上加一个云台控制界面 问题: 对于实时直播的视频播放, 由于播放页面客观样式要求(一个播放器占据了整个页面),因此很难找出很合理的空间来放置其他功能按钮的位置(比如配合实时是平的云台控制界 ...

  6. 时间写入文件名 nohup 原理 Command In Background your shell may have its own version of nohup

    echo 123 > `date +%Y-%m-%d-%H.tmp` echo 123 > /home/`date +%Y-%m-%d-%H.tmp` nohup --help [root ...

  7. 用于string对象中字符截取的几种函数总结——语法、参数意义及用途举例

    1. charAt():返回指定位置的字符. 语法:stringObject.charAt(index) 参数意义:index  必需,指字符在字符串中的下标.需要注意的是,字符串中第一个字符的下标是 ...

  8. 【题解】 P5021赛道修建

    [题解]P5021 赛道修建 二分加贪心,轻松拿省一(我没有QAQ) 题干有提示: 输出格式: 输出共一行,包含一个整数,表示长度最小的赛道长度的最大值. 注意到没,最小的最大值,还要多明显? 那么我 ...

  9. 创建laravel项目

    下载项目到本地 git clone https://github.com/251068550/LaraBlog.git compoer安装 cd LaraBlog composer install 如 ...

  10. 利用Linux中的计划任务+PHP网页程序(转)

    利用Linux中的计划任务+PHP网页程序,实现对web服务器运行状况的监测[每5分钟监测一次,并邮件提醒]一.我的监测服务器环境:rhel5.5+apache2.2+php5二.功能描述:写一个PH ...