BZOJ3456:城市规划——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=3456
求出n个点的简单(无重边无自环)无向连通图数目
模数很熟悉,先敲一个NTT。
然后通过推导式子就做完啦!
我觉得就算怎么讲也没有下面这一位好:http://blog.miskcoo.com/2015/05/bzoj-3456
另外多项式求逆:http://blog.miskcoo.com/2015/05/polynomial-inverse
至少我学到了:当你有个卷积知道答案,求卷积的一项时转换成生成函数再FFT一下就好了。
#include<cstdio>
#include<cctype>
#include<cstring>
#include<vector>
#include<cmath>
#include<algorithm>
#include<iostream>
using namespace std;
typedef long long ll;
const ll P=;
const int G=;
const int N=5e5+;
ll qpow(ll a,ll n,ll p){
ll res=;
while(n){
if(n&)res=res*a%p;
a=a*a%p;n>>=;
}
return res;
}
void MTT(ll a[],int n,int on){
for(int i=,j=n>>;i<n-;i++){
if(i<j)swap(a[i],a[j]);
int k=n>>;
while(j>=k){j-=k;k>>=;}
if(j<k)j+=k;
}
for(int i=;i<=n;i<<=){
ll res=qpow(G,(P-)/i,P);
for(int j=;j<n;j+=i){
ll w=;
for(int k=j;k<j+i/;k++){
ll u=a[k],t=w*a[k+i/]%P;
a[k]=(u+t)%P;
a[k+i/]=(u-t+P)%P;
w=w*res%P;
}
}
}
if(on==-){
ll inv=qpow(n,P-,P);
a[]=a[]*inv%P;
for(int i=;i<=n/;i++){
a[i]=a[i]*inv%P;
if(i!=n-i)a[n-i]=a[n-i]*inv%P;
swap(a[i],a[n-i]);
}
}
}
ll t[N];
void inv(int deg,ll a[],ll b[]){
if(deg==){
b[]=qpow(a[],P-,P);
return;
}
inv((deg+)>>,a,b);
int n=;
while(n<(deg<<))n<<=;
for(int i=;i<deg;i++)t[i]=a[i];
for(int i=deg;i<n;i++)t[i]=;
MTT(t,n,);MTT(b,n,);
for(int i=;i<n;i++)
b[i]=b[i]*(-b[i]*t[i]%P+P)%P;
MTT(b,n,-);
for(int i=deg;i<n;i++)b[i]=;
}
int n;
ll f[N],g[N],tmp[N],c[N],jc[N],C[N][];
inline void init(){
jc[]=jc[]=;C[][];
for(int i=;i<=n;i++)jc[i]=jc[i-]*i%P;
for(int i=;i<=n;i++)C[i][]=C[i-][]+i-;
}
int main(){
scanf("%d",&n);init();
for(int i=;i<=n;i++){
g[i]=qpow(,C[i][],P)*qpow(jc[i],P-,P)%P;
if(i)c[i]=qpow(,C[i][],P)*qpow(jc[i-],P-,P)%P;
}
int nn=;
while(nn<=n)nn<<=; inv(nn,g,tmp);memcpy(g,tmp,sizeof(tmp)); MTT(g,nn,);MTT(c,nn,);
for(int i=;i<nn;i++)f[i]=g[i]*c[i]%P;
MTT(f,nn,-); f[n]=f[n]*jc[n-]%P;
printf("%lld\n",f[n]);
return ;
}
+++++++++++++++++++++++++++++++++++++++++++
+本文作者:luyouqi233。 +
+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/ +
+++++++++++++++++++++++++++++++++++++++++++
BZOJ3456:城市规划——题解的更多相关文章
- BZOJ3456 城市规划 【多项式求ln】
题目链接 BZOJ3456 题解 真是一道经典好题,至此已经写了分治\(NTT\),多项式求逆,多项式求\(ln\)三种写法 我们发现我们要求的是大小为\(n\)无向联通图的数量 而\(n\)个点的无 ...
- [BZOJ3456]城市规划(生成函数+多项式求逆+多项式求ln)
城市规划 时间限制:40s 空间限制:256MB 题目描述 刚刚解决完电力网络的问题, 阿狸又被领导的任务给难住了. 刚才说过, 阿狸的国家有n个城市, 现在国家需要在某些城市对之间建立一 ...
- BZOJ3456 城市规划 【多项式求逆】
题目链接 BZOJ3456 题解 之前我们用分治\(ntt\)在\(O(nlog^2n)\)的复杂度下做了这题,今天我们使用多项式求逆 设\(f_n\)表示\(n\)个点带标号无向连通图数 设\(g_ ...
- BZOJ3456 城市规划 【分治NTT】
题目链接 BZOJ3456 题解 据说这题是多项式求逆 我太弱不会QAQ,只能\(O(nlog^2n)\)分治\(NTT\) 设\(f[i]\)表示\(i\)个节点的简单无向连通图的数量 考虑转移,直 ...
- BZOJ3456: 城市规划
Description 刚刚解决完电力网络的问题, 阿狸又被领导的任务给难住了. 刚才说过, 阿狸的国家有n个城市, 现在国家需要在某些城市对之间建立一些贸易路线, 使得整个国家的任意两个城市都直接或 ...
- BZOJ3456城市规划
题目描述 刚刚解决完电力网络的问题, 阿狸又被领导的任务给难住了.刚才说过, 阿狸的国家有n个城市, 现在国家需要在某些城市对之间建立一些贸易路线, 使得整个国家的任意两个城市都直接或间接的连通.为了 ...
- BZOJ3456 城市规划(多项式求逆)
设f[i]为连通图的数量,g[i]为不连通图的数量,显然有f[i]=2i*(i-1)/2-g[i],g[i]通过枚举1所在连通块大小转移,有g[i]=Σf[j]*C(i-1,j-1)·2(i-j)*( ...
- bzoj3456城市规划 多项式取模
題目大意 求出有n个点的有标号简单连通无向图的数目. 题解 什么破玩意,直接输出\(2^{C_n^2}\)走人 我们发现这张图要求连通,而上式肯定不能保证连通. 其实上式表示的是不保证连通的有标号简单 ...
- BZOJ3456 城市规划 【生成函数】【FFT】
题目分析: 容易想到生成函数的构造方法. 令g(n)表示n个点的无向图个数,f(n)表示n个点的无向连通图的个数.式子是显然的. 容易发现式子是卷积的形式,写出生成函数,然后多项式求逆后多项式乘法即可 ...
随机推荐
- css 网站常用
简单的loading效果 .progressBar { border: solid 1px #303031; font: bold 20px/22px Arial, sans-serif; backg ...
- 聊聊WS-Federation
本文来自网易云社区 单点登录(Single Sign On),简称为 SSO,目前已经被大家所熟知.简单的说, 就是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统. 举例: 我们 ...
- uvaoj 1081510815 - Andy's First Dictionary(set应用)
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=835&page= ...
- Linux命令应用大词典-第22章 GRUB
22.1 grub-md5-crypt:使用MD5格式加密口令 22.2 grub-install:在设备上安装GRUB 22.3 grub:进入GRUB命令shell 22.4 grub-crypt ...
- 【WXS数据类型】Object
Object 是一种无序的键值对. 属性: 名称 值类型 说明 [Object].constructor [String] 返回值为“Object”,表示类型的结构字符串 方法: 原型:[Object ...
- Idea Live Templates
常用live templates 模板 注释 : * * @param $params$ * @return $return$ * $date$ $time$ chiyuanzhen743 */ lo ...
- spark dataset join 使用方法java
dataset<Row> df1,df2,df3 //该方法可以执行成功 df3= df1.join(df2,"post_id").selectExpr("h ...
- Java中定时器相关实现的介绍与对比之:Timer和TimerTask
Timer和TimerTask JDK自带,具体的定时任务由TimerTask指定,定时任务的执行调度由Timer设定.Timer和TimerTask均在包java.util里实现. 本文基于java ...
- Elasticsearch 排序插件的开发
直接观察到的几个问题 简单expression脚本的执行效率 > java 插件,10000条数据可以测试出1ms左右的差距. Es会不断调用newScript来创建"足够多" ...
- 4-2:实现cp命令
#include <stdio.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h& ...