bzoj3456城市规划 多项式取模
題目大意
求出有n个点的有标号简单连通无向图的数目。
题解
什么破玩意,直接输出\(2^{C_n^2}\)走人
我们发现这张图要求连通,而上式肯定不能保证连通。
其实上式表示的是不保证连通的有标号简单无向图。
就差在一个连通上啊。
所以我们设\(f(x)\)表示有x个点的有标号简单连通无向图的数目。
然后设\(g(x)\)为上式,即不保证连通时的方案数
于是我们枚举节点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城市规划 多项式取模的更多相关文章
- Luogu3824 [NOI2017]泳池 【多项式取模】【递推】【矩阵快速幂】
题目分析: 用数论分块的思想,就会发现其实就是连续一段的长度$i$的高度不能超过$\lfloor \frac{k}{i} \rfloor$,然后我们会发现最长的非$0$一段不会超过$k$,所以我们可以 ...
- 【BZOJ4944】【NOI2017】泳池 概率DP 常系数线性递推 特征多项式 多项式取模
题目大意 有一个\(1001\times n\)的的网格,每个格子有\(q\)的概率是安全的,\(1-q\)的概率是危险的. 定义一个矩形是合法的当且仅当: 这个矩形中每个格子都是安全的 必须紧贴网格 ...
- 洛谷P4723 【模板】线性递推(多项式取模 线性代数)
题意 题目链接 Sol Orz shadowice 注意,下面的代码自带O(随时TLE)倍大常数.. #include<bits/stdc++.h> #define Pair pair&l ...
- bzoj3456 城市规划 多项式求In
\(n\)个点的无向联通图的个数 打着好累啊 一定要封装一个板子 记\(C(x)\)为无向图个数的指数型生成函数,\(C(0) = 1\) 记\(G(x)\)为无向联通图个数的指数型生成函数,\(G( ...
- 【learning】多项式相关(求逆、开根、除法、取模)
(首先要%miskcoo,这位dalao写的博客(这里)实在是太强啦qwq大部分多项式相关的知识都是从这位dalao博客里面学的,下面这篇东西是自己对其博客学习后的一些总结和想法,大部分是按照其博客里 ...
- 2019.01.03 bzoj3456: 城市规划(生成函数+多项式取对)
传送门 生成函数好题. 题意:求n个点的简单(无重边无自环)无向连通图数目 思路: 对简单无向图构造生成函数f(x)=∑n2Cn2xnn!f(x)=\sum_n2^{C_n^2}\frac{x^n}{ ...
- Re.多项式除法/取模
前言 emmm又是暂无 前置 多项式求逆 多项式除法/取模目的 还是跟之前一样顾名思义] 给定一个多项式F(x),请求出多项式Q(x)和R(x),满足F(x)=Q(x)∗G(x)+R(x),R项数小于 ...
- 位运算之——按位与(&)操作——(快速取模算法)
学习redis 字典结构,hash找槽位 求槽位的索引值时,用到了 hash值 & sizemask操作, 其后的scan操作涉及扫描顺序逻辑,对同模的槽位 按一定规则扫描! 其中涉及位运算 ...
- 【Java基础】14、位运算之——按位与(&)操作——(快速取模算法)
学习redis 字典结构,hash找槽位 求槽位的索引值时,用到了 hash值 & sizemask操作, 其后的scan操作涉及扫描顺序逻辑,对同模的槽位 按一定规则扫描! 其中涉及位运算 ...
随机推荐
- nginx 代理模式下,获取客户端真实IP
最近做博友推荐,发现个小问题,用$_SERVER['REMOTE_ADDR'];得到的都是服务器的地址192.168.96.52,搜索了一下,发现问题,改为$_SERVER['HTTP_X_REAL_ ...
- openssl源码安装
下载最新的OpenSSL http://openssl.org/source/ ./config make make install 通过命令openssl version或者openssl ...
- 转载 ----Android学习笔记 - 蓝牙篇 (Bluetooth)
1.什么是蓝牙 Bluetooth是目前使用的最广泛的无线通讯协议之一 主要针对短距离设备通讯(10米) 常用于连接耳机.鼠标和移动通讯设备等 2.发现周围蓝牙设备 BluetoothAd ...
- activemq 安装-单点
一,准备工作:首先安装jdk1.7及其以上版本,此环境安装的是jdk-1.8 二.搭建activemq 环境: 192.168.9.25 centos6.5 ...
- EasyNVR H5无插件摄像机直播解决方案前端解析之:如何在播放界面添加实时云台控制界面
如何在播放器上加一个云台控制界面 问题: 对于实时直播的视频播放, 由于播放页面客观样式要求(一个播放器占据了整个页面),因此很难找出很合理的空间来放置其他功能按钮的位置(比如配合实时是平的云台控制界 ...
- 时间写入文件名 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 ...
- 用于string对象中字符截取的几种函数总结——语法、参数意义及用途举例
1. charAt():返回指定位置的字符. 语法:stringObject.charAt(index) 参数意义:index 必需,指字符在字符串中的下标.需要注意的是,字符串中第一个字符的下标是 ...
- 【题解】 P5021赛道修建
[题解]P5021 赛道修建 二分加贪心,轻松拿省一(我没有QAQ) 题干有提示: 输出格式: 输出共一行,包含一个整数,表示长度最小的赛道长度的最大值. 注意到没,最小的最大值,还要多明显? 那么我 ...
- 创建laravel项目
下载项目到本地 git clone https://github.com/251068550/LaraBlog.git compoer安装 cd LaraBlog composer install 如 ...
- 利用Linux中的计划任务+PHP网页程序(转)
利用Linux中的计划任务+PHP网页程序,实现对web服务器运行状况的监测[每5分钟监测一次,并邮件提醒]一.我的监测服务器环境:rhel5.5+apache2.2+php5二.功能描述:写一个PH ...