p4841 城市规划
分析
https://www.luogu.org/blog/DRA/solution-p4841
代码(似乎附赠了一个全家桶呢)
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline")
#pragma GCC optimize("-fgcse")
#pragma GCC optimize("-fgcse-lm")
#pragma GCC optimize("-fipa-sra")
#pragma GCC optimize("-ftree-pre")
#pragma GCC optimize("-ftree-vrp")
#pragma GCC optimize("-fpeephole2")
#pragma GCC optimize("-ffast-math")
#pragma GCC optimize("-fsched-spec")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("-falign-jumps")
#pragma GCC optimize("-falign-loops")
#pragma GCC optimize("-falign-labels")
#pragma GCC optimize("-fdevirtualize")
#pragma GCC optimize("-fcaller-saves")
#pragma GCC optimize("-fcrossjumping")
#pragma GCC optimize("-fthread-jumps")
#pragma GCC optimize("-funroll-loops")
#pragma GCC optimize("-fwhole-program")
#pragma GCC optimize("-freorder-blocks")
#pragma GCC optimize("-fschedule-insns")
#pragma GCC optimize("inline-functions")
#pragma GCC optimize("-ftree-tail-merge")
#pragma GCC optimize("-fschedule-insns2")
#pragma GCC optimize("-fstrict-aliasing")
#pragma GCC optimize("-fstrict-overflow")
#pragma GCC optimize("-falign-functions")
#pragma GCC optimize("-fcse-skip-blocks")
#pragma GCC optimize("-fcse-follow-jumps")
#pragma GCC optimize("-fsched-interblock")
#pragma GCC optimize("-fpartial-inlining")
#pragma GCC optimize("no-stack-protector")
#pragma GCC optimize("-freorder-functions")
#pragma GCC optimize("-findirect-inlining")
#pragma GCC optimize("-frerun-cse-after-loop")
#pragma GCC optimize("inline-small-functions")
#pragma GCC optimize("-finline-small-functions")
#pragma GCC optimize("-ftree-switch-conversion")
#pragma GCC optimize("-foptimize-sibling-calls")
#pragma GCC optimize("-fexpensive-optimizations")
#pragma GCC optimize("-funsafe-loop-optimizations")
#pragma GCC optimize("inline-functions-called-once")
#pragma GCC optimize("-fdelete-null-pointer-checks")
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int g = ;
const int mod = ;
int G,a[],b[],c[],len,r[],a1[],b1[],ib[],ans[],ans2[];
inline int pw(int x,int p){
int res=;
while(p){if(p&)res=res*x%mod;x=x*x%mod,p>>=;}
return res;
}
#define pi acos(-1.0)
struct node {
double x,y;
};
node A[],B[];
inline node operator + (const node x,const node y){return (node){x.x+y.x,x.y+y.y};}
inline node operator - (const node x,const node y){return (node){x.x-y.x,x.y-y.y};}
inline node operator * (const node x,const node y){return (node){x.x*y.x-x.y*y.y,x.x*y.y+x.y*y.x};}
inline void fft(node a[],int f,int n){
int i,j,k;
for(i=;i<n;i++)if(i<r[i])swap(a[i],a[r[i]]);
for(i=;i<n;i<<=){
node wn=(node){cos(pi/i),f*sin(pi/i)};
for(j=;j<n;j+=(i<<)){
node w=(node){,},p,q;
for(k=;k<i;k++,w=w*wn){
p=a[j+k],q=a[i+j+k]*w;
a[j+k]=p+q,a[i+j+k]=p-q;
}
}
}
if(f==-)for(i=;i<n;i++)a[i].x=a[i].x/n;
return;
}
inline void get_fft_mul(node A[],node B[],int n){
int N=;
for(N=;N<=n;N<<=)len++;
for(int i=;i<N;i++)r[i]=((r[i>>]>>)|((i&)<<(len-)));
fft(A,,N),fft(B,,N);
for(int i=;i<N;i++)A[i]=A[i]*B[i];
fft(A,-,N);
for(int i=;i<N;i++)ans[i]=(int)(A[i].x+0.5);
return;
}
inline void fwt_or(int a[],int f,int n){
int i,j,k;
for(i=;i<n;i<<=)
for(j=;j<n;j+=(i<<))
for(k=;k<i;k++){
if(f==)a[i+j+k]=(a[j+k]+a[i+j+k])%mod;
else a[i+j+k]=(a[i+j+k]+mod-a[j+k])%mod;
}
}
inline void fwt_and(int a[],int f,int n){
int i,j,k;
for(i=;i<n;i<<=)
for(j=;j<n;j+=(i<<))
for(k=;k<i;k++){
if(f==)a[j+k]=(a[j+k]+a[i+j+k])%mod;
else a[j+k]=(a[j+k]+mod-a[i+j+k])%mod;
}
}
inline void fwt_xor(int a[],int f,int n){
int i,j,k,inv2=pw(,mod-);
for(i=;i<n;i<<=)
for(j=;j<n;j+=(i<<))
for(k=;k<i;k++){
int x=a[j+k],y=a[i+j+k];
a[j+k]=(x+y)%mod;a[i+j+k]=(x+mod-y)%mod;
}
if(f==-)for(i=;i<n;i++)a[i]=a[i]*inv2%mod;
}
inline void ntt(int a[],int opt,int n){
int i,j,k,inv=pw(n,mod-),now,wn,w,p,q;
for(i=;i<n;i++)if(i<r[i])swap(a[i],a[r[i]]);
for(i=;i<n;i<<=){
now=(opt==?g:G),wn=pw(now,(mod-)/(i<<));
for(j=;j<n;j+=(i<<))
for(k=,w=;k<i;k++,w=w*wn%mod)
p=a[j+k],q=a[i+j+k]*w%mod,a[j+k]=(p+q)%mod,a[i+j+k]=(p-q+mod)%mod;
}
if(opt==-)for(i=;i<n;i++)a[i]=a[i]*inv%mod;
return;
}
inline void cdq_fft(int le,int ri){
if(le==ri){
//.....
return;
}
int i,j,k,n,m=ri-le,mid=(le+ri)>>;len=;
cdq_fft(le,mid);
for(n=;n<=*(m+);n<<=)len++;
for(i=;i<n;i++)a1[i]=b1[i]=;
for(i=;i<n;i++)r[i]=((r[i>>]>>)|((i&)<<(len-)));
//for(i=0;i<=mid-le;i++)b1[i]=b[i+le];
//for(i=0;i<=m;i++)a1[i]=a[i];
ntt(a1,,n),ntt(b1,,n);
//for(i=0;i<n;i++)b1[i]=a1[i]*b1[i]%mod;
ntt(b1,-,n);
for(i=mid+;i<=ri;i++)b[i]=(b[i]+b1[i-le])%mod;
cdq_fft(mid+,ri);
return;
}
inline void get_inv(int x,int a[],int b[]){
if(x==){b[]=pw(a[],mod-);return;}
int i,j,k,n;get_inv((x+)>>,a,b);len=;
for(n=;n<(x<<);n<<=)len++;
for(i=;i<n;i++)r[i]=((r[i>>]>>)|((i&)<<(len-)));
for(i=;i<x;i++)c[i]=a[i];for(i=x;i<n;i++)c[i]=;
ntt(b,,n),ntt(c,,n);
for(i=;i<n;i++)b[i]=(-c[i]*b[i]%mod+mod)%mod*b[i]%mod;
ntt(b,-,n);for(i=x;i<n;i++)b[i]=;return;
}
inline void get_dao(int n,int a[],int b[]){
for(int i=;i<n;i++)b[i]=a[i+]*(i+)%mod;
b[n-]=;return;
}
inline void get_ji(int n,int a[],int b[]){
for(int i=n-;i>;i--)b[i]=a[i-]*pw(i,mod-)%mod;
b[]=;return;
}
inline void get_mul(int n,int a[],int b[]){
int i,j,k;
ntt(a,,n),ntt(b,,n);
for(i=;i<n;i++)a[i]=a[i]*b[i]%mod;
ntt(a,-,n);return;
}
inline void get_ln(int n,int a[],int b[]){
for(int i=;i<(n<<);i++)b[i]=;
get_inv(n,a,b);
int N;len=;
for(N=;N<(n<<);N<<=)len++;
for(int i=;i<N;i++)r[i]=((r[i>>]>>)|((i&)<<(len-)));
get_dao(N,a,a1);
get_mul(N,a1,b);
get_ji(N,a1,b);
for(int i=;i<N;i++)a1[i]=;
return;
}
inline void get_exp(int n,int a[],int b[]){
if(n==){b[]=;return;}
get_exp((n+)>>,a,b);
get_ln(n,b,b1);
b1[]=(a[]+-b1[]+mod)%mod;
for(int i=;i<n;i++)b1[i]=(a[i]-b1[i]+mod)%mod;
int N;len=;
for(N=;N<(n<<);N<<=)len++;
for(int i=;i<N;i++)r[i]=((r[i>>]>>)|((i&)<<(len-)));
for(int i=n;i<N;i++)b[i]=b1[i]=;
ntt(b,,N),ntt(b1,,N);
for(int i=;i<N;i++)b[i]=b[i]*b1[i]%mod;
ntt(b,-,N);
for(int i=n;i<N;i++)b[i]=b1[i]=;
}
inline int read_pw(){
int x=;char s=getchar();
while(!isdigit(s))s=getchar();
while(isdigit(s))x=((x<<)+(x<<)+(s-''))%mod,s=getchar();
return x;
}
inline void get_pw(int n,int a[],int b[],int k){
get_ln(n,a,b);
for(int i=;i<n;i++)b[i]=b[i]*k%mod;
get_exp(n,b,ans);
return;
}
inline void get_div(int n,int m,int a1[],int b1[]){
int i,j,k;
for(i=;i<n;i++)a[i]=a1[n--i];
for(i=;i<m;i++)b[i]=b1[m--i],ib[i]=;
for(i=n-m+;i<m;i++)b[i]=;
get_inv(n-m+,b,ib);
int N;len=;
for(N=;N<(n<<);N<<=)len++;
for(int i=;i<N;i++)r[i]=((r[i>>]>>)|((i&)<<(len-)));
get_mul(N,a,ib);
int _n=n-m+;
for(i=;i<_n;i++)ans[i]=a[_n--i],printf("%lld ",ans[i]);
for(i=;i<m;i++)b[i]=b1[m--i];
for(i=m;i<N;i++)b[i]=;
puts("");
get_mul(N,ans,b1);
for(i=;i<m-;i++)ans2[i]=(a1[i]-ans[i]+mod)%mod,printf("%lld ",ans2[i]);
puts("");
return;
}
int fac[],inv[];
signed main(){
G=pw(g,mod-);
int n,m,i,k;
scanf("%lld",&n);
//k=read_pw();
k=;
fac[]=;
for(i=;i<=n;i++)fac[i]=fac[i-]*i%mod;
inv[n]=pw(fac[n],mod-);
for(i=n-;i>=;i--)inv[i]=inv[i+]*(i+)%mod;
for(i=;i<=n;i++)a[i]=pw(,i*(i-)/)*inv[i]%mod;
get_inv(n+,a,b);
int N;len=;
for(N=;N<=n+;N<<=)len++;
for(i=;i<N;i++)r[i]=((r[i>>]>>)|((i&)<<(len-)));
for(i=;i<N;i++)a[i]=;
for(i=;i<=n;i++)a[i]=pw(,i*(i-)/)*inv[i-]%mod;
get_mul(N,a,b);a[]=;
for(i=;i<N;i++)a[i]=a[i]*fac[i-]%mod*inv[i]%mod;
for(i=N;i<=;i++)a[i]=;
memset(b,,sizeof(b));
get_pw(n+,a,b,k);
printf("%lld\n",ans[n]*fac[n]%mod);
return ;
}
p4841 城市规划的更多相关文章
- 洛谷 P4841 城市规划 解题报告
P4841 城市规划 题意 n个有标号点的简单(无重边无自环)无向连通图数目. 输入输出格式 输入格式: 仅一行一个整数\(n(\le 130000)\) 输出格式: 仅一行一个整数, 为方案数 \( ...
- 【题解】P4841 城市规划(指数型母函数+多项式Ln)
[题解]P4841 城市规划 P4841 城市规划 超级弱化版本(DP):POJ - 1737 两张图不同当且仅当边的分布不一样的时候,带编号最后乘一个阶乘即可,现在最主要的问题就是"联通& ...
- 洛谷P4841 城市规划(生成函数 多项式求逆)
题意 链接 Sol Orz yyb 一开始想的是直接设\(f_i\)表示\(i\)个点的无向联通图个数,枚举最后一个联通块转移,发现有一种情况转移不到... 正解是先设\(g(n)\)表示\(n\)个 ...
- 洛谷P4841 城市规划 [生成函数,NTT]
传送门 题意简述:求\(n\)个点的简单无向连通图的数量\(\mod \;1004535809\),\(n \leq 130000\) 经典好题呀!这里介绍两种做法:多项式求逆.多项式求对数 先 ...
- 洛谷 P4841 城市规划
构造简单无向图的EGF: \[ G(x)=\sum_{i}^{\infty}2^{\binom{i}{2}}\cdot\frac{x^i}{i!} \] 构造简单无向连通图的EGF: \[ F(x)= ...
- P4841 城市规划 FFT+生成函数
\(\color{#0066ff}{ 题目描述 }\) 刚刚解决完电力网络的问题, 阿狸又被领导的任务给难住了. 刚才说过, 阿狸的国家有n个城市, 现在国家需要在某些城市对之间建立一些贸易路线, 使 ...
- [洛谷P4841]城市规划
题目大意:求$n$个点的带标号的无向连通图的个数 题解:令$F(x)$为带标号无向连通图个数生成函数,$G(x)$为带标号无向图个数生成函数 那么$G(x) = \sum_{i=0}^{\infty} ...
- 洛谷P4841 城市规划(多项式求逆)
传送门 这题太珂怕了……如果是我的话完全想不出来…… 题解 //minamoto #include<iostream> #include<cstdio> #include< ...
- 【题解】有标号的DAG计数4
[HZOI 2015] 有标号的DAG计数 IV 我们已经知道了\(f_i\)表示不一定需要联通的\(i\)节点的dag方案,考虑合并 参考[题解]P4841 城市规划(指数型母函数+多项式Ln),然 ...
随机推荐
- sudo pip install -i http://pypi.douban.com/simple/ --trusted-host=pypi.douban.com/simple ipython
sudo pip install -i http://pypi.douban.com/simple/ --trusted-host=pypi.douban.com/simple ipython
- 使用 ref 和 out 传递数组注意事项
1.与所有的 out参数一样,在使用数组类型的 out 参数前必须先为其赋值,即必须由被调用方为其赋值 示例 :在此例中,在调用方(Main 方法)中声明数组 theArray,并在 FillArra ...
- 使用pdfjs插件在线预览PDF文件
前言 本文介绍在html中使用 pdfjs插件在线预览PDF文件的方法. 实现步骤 下载 pdfjs 并引入项目中 到PDFJS官网 http://mozilla.github.io/pdf.js/g ...
- CenterOS7中解决No package mysql-server available.
CenterOS7中解决No package mysql-server available. 1.使用yum install -y mysql-server报错如下: [root@heyong_jd ...
- 025-Cinder服务-->安装并配置一个本地存储节点(ISCSI)
一:Cinder提供块级别的存储服务,块存储提供一个基础设施为了管理卷,以及和OpenStack计算服务交互,为实例提供卷.此服务也会激活管理卷的快照和卷类型的功能,块存储服务通常包含下列组件:cin ...
- Stylus-富有表现力的、动态的、健壮的CSS
今天总结一下Stylus记一些常用的也是最基本的用法 一. 选择器 Stylus是基于缩进的这让我们可以更快捷的编写css比如 body { margin:; paddind:; font-size ...
- pdf幻灯片:圆锥曲线中的“三定”问题探究(一)
预留的广告位! 下载该pdf文件,然后在adobe reader 的"视图"中使用"全屏模式"播放该幻灯片 #include <iostream> ...
- APIO2019 题解
APIO2019 题解 T1 奇怪装置 题目传送门 https://loj.ac/problem/3144 题解 很容易发现,这个东西一定会形成一个环.我们只需要求出环的长度就解决了一切问题. 设环的 ...
- Django【第21篇】:Ajax之FormData
ajax补充--------FormData等... 一.回顾上节知识点 1.什么是json字符串? 轻量级的数据交换格式 2.定时器:关于setTimeout setTimeout(foo,3000 ...
- v-if 和 v-show
关于条件渲染 所谓条件渲染,就是根据不同的条件,使用不同的模板来生成 html. 在 Vue.js 中,使用 v-if 和 v-show 指令来控制条件渲染. 区别 v-show 会在app初始化的时 ...