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),然 ...
随机推荐
- gcc编译工具生成动态库和静态库
一. 库的分类 1.1. 静态库(.a) 1.1.1. 静态库的代码在编译过程中已经被载入可执行程序,因此体积比较大.所以生成的可执行文件就不受库的影响了,即使库被删除了,程序依然可以成功运行. 1. ...
- Vue-cli3 简qian易yi教程
原文地址 对于没有了解过 vue-cli3 的童鞋,建议先去看看官方的教程: 传送门 新版本的新特性 1. 插件 使用 cli 的插件,可以很快的搭建一个项目的结构.如 axios 的插件 vue-c ...
- PY个树状数组
树状数组看起来比较简单,于是就挑它下手了... 于是生活终于也对咱下手了... 要讲的就两个东西,一个是开数组,全局变量写最前面,数组是这么开的: f=[0 for i in range(500005 ...
- 小a的轰炸游戏(差分,前缀和)
题目传送门 题意: 给出一个n*m的矩形,然后有两个操作. 1操作,对一个给出的菱形,对菱形范围内的东西进行+1. 2操作,对一个上半菱形的区域,进行+1操作. 最后求矩形内各个数的异或和. 思路: ...
- 深入了解RabbitMQ工作原理及简单使用
深入了解RabbitMQ工作原理及简单使用 RabbitMQ系列文章 RabbitMQ在Ubuntu上的环境搭建 深入了解RabbitMQ工作原理及简单使用 RabbitMQ交换器Exchange介绍 ...
- onehot编码解释
什么是One-Hot编码? One-Hot编码,又称为一位有效编码,主要是采用N位状态寄存器来对N个状态进行编码,每个状态都由他独立的寄存器位,并且在任意时候只有一位有效. One-Hot编码是分类变 ...
- 神经网络之:S型神经元
1.S 型神经元和感知器类似,但是被修改为权重和偏置的微小改动只引起输出的微小变化 2.S型神经元结构: S型函数: 带有x1,x2,........,权重w1,w2.....,和偏置b的S型神经元的 ...
- IBM公司面试题
进入IBM差不多是每一个IT人的梦想.IBM公司向来以高素质人才作为企业持续竞争力的保证,所以经常出一些千奇百怪的面试题,来考验一个人的综合能力,以下是5道IBM曾经出过的面试题,看看你能作出几道: ...
- Antd时间选择框汉化问题总结------国际化全局设置
import zh_CN from 'antd/lib/locale-provider/zh_CN'; import 'moment/locale/zh-cn'; import { ConfigPro ...
- Eclipse Git分支实战
切换分支 右键工程,创建新分支 命名新分支 点击finish,可以看到项目已经切换到hot_fix 修改代码: Ctrl+#提交到本地仓库,之后提交到远程仓库 Next,Finish 等待一下, 点击 ...