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操作涉及扫描顺序逻辑,对同模的槽位 按一定规则扫描! 其中涉及位运算 ...
随机推荐
- MySql(六):影响 MySQL Server 性能的相关因素
MySQL 最多的使用场景是WEB 应用,那么我们就以一个WEB 应用系统为例,逐个分析其系统构成,进行经验总结,分析出数据库应用系统中各个环境对性能的影响. 一.商业需求对性能的影响 这里我们就拿一 ...
- Android 开发资源
0x00 Android 入门资料 a. Android 学习之路 b.<第一行代码> 介绍及购买链接:http://blog.csdn.net/guolin_blog/article/d ...
- 蓝桥杯OJ PREV-19 九宫重排
题目描写叙述: 历届试题 九宫重排 时间限制:1.0s 内存限制:256.0MB 问题描写叙述 如以下第一个图的九宫格中,放着 1~8 的数字卡片.另一个格子空着.与空格子相 ...
- java 方法重写原则
方法重写应遵循“三同一小一大”原则: “三同”:即方法名相同,形参列表相同,返回值类型相同: “一小”:子类方法声明抛出的异常比父类方法声明抛出的异常更小或者相等: “一大”:子类方法的访问修饰符应比 ...
- 关于ejabberd限制单点登录
ejabberd 是对xmpp协议的完全实现,那么单纯的ejabberd是不提供该功能限制的,但是从我们的xmpp协议则可以完全的解决这个问题,我们通过jid对它进行限制,下面可以看一下jid的解释: ...
- PHP数据类型转换和运算符表达式
一:数据类型的转换 获取类型: gettype($a); 判断是否是某种类型的数据: is_类型名($a); 1.(int)$a; 2.settype($a,int); 二:运算符表达式 1.数学运算 ...
- TCP的四种定时器简单记录
TCP管理的4个不同的定时器: 1.重传定时器:用于当希望收到另一端的确认. 2.坚持定时器:使窗口大小信息保持不断流动. 3.保活定时器:检测TCP空闲连接的另一端何时崩溃或重启. 4.2MSL定时 ...
- Django框架ORM单表删除表记录_模型层
此方法依赖的表是之前创建的过的一张表 参考链接:https://www.cnblogs.com/apollo1616/p/9840354.html 1.删除方法就是delete(),它运行时立即删除对 ...
- linux怎么设置vsftp用户访问目录权限
1.在指定的目录创建文件夹(访问的目录): mkdir picture 2.创建一个用户组(zdhgroup): groupadd zdhgroup 3.创建一个用户并指定路径和组: useradd ...
- global 全局变量的用法
说明:i 和foo()都为全局变量,i 是在模块文件顶层注册的,所以为全局变量,他能够在函数内部进行引用而不需要再特意声明是全局变量,且foo()函数也是全局变量 1.当没有局部变量时,print(i ...