分析

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 城市规划的更多相关文章

  1. 洛谷 P4841 城市规划 解题报告

    P4841 城市规划 题意 n个有标号点的简单(无重边无自环)无向连通图数目. 输入输出格式 输入格式: 仅一行一个整数\(n(\le 130000)\) 输出格式: 仅一行一个整数, 为方案数 \( ...

  2. 【题解】P4841 城市规划(指数型母函数+多项式Ln)

    [题解]P4841 城市规划 P4841 城市规划 超级弱化版本(DP):POJ - 1737 两张图不同当且仅当边的分布不一样的时候,带编号最后乘一个阶乘即可,现在最主要的问题就是"联通& ...

  3. 洛谷P4841 城市规划(生成函数 多项式求逆)

    题意 链接 Sol Orz yyb 一开始想的是直接设\(f_i\)表示\(i\)个点的无向联通图个数,枚举最后一个联通块转移,发现有一种情况转移不到... 正解是先设\(g(n)\)表示\(n\)个 ...

  4. 洛谷P4841 城市规划 [生成函数,NTT]

    传送门 题意简述:求\(n​\)个点的简单无向连通图的数量\(\mod \;1004535809​\),\(n \leq 130000​\) 经典好题呀!这里介绍两种做法:多项式求逆.多项式求对数 先 ...

  5. 洛谷 P4841 城市规划

    构造简单无向图的EGF: \[ G(x)=\sum_{i}^{\infty}2^{\binom{i}{2}}\cdot\frac{x^i}{i!} \] 构造简单无向连通图的EGF: \[ F(x)= ...

  6. P4841 城市规划 FFT+生成函数

    \(\color{#0066ff}{ 题目描述 }\) 刚刚解决完电力网络的问题, 阿狸又被领导的任务给难住了. 刚才说过, 阿狸的国家有n个城市, 现在国家需要在某些城市对之间建立一些贸易路线, 使 ...

  7. [洛谷P4841]城市规划

    题目大意:求$n$个点的带标号的无向连通图的个数 题解:令$F(x)$为带标号无向连通图个数生成函数,$G(x)$为带标号无向图个数生成函数 那么$G(x) = \sum_{i=0}^{\infty} ...

  8. 洛谷P4841 城市规划(多项式求逆)

    传送门 这题太珂怕了……如果是我的话完全想不出来…… 题解 //minamoto #include<iostream> #include<cstdio> #include< ...

  9. 【题解】有标号的DAG计数4

    [HZOI 2015] 有标号的DAG计数 IV 我们已经知道了\(f_i\)表示不一定需要联通的\(i\)节点的dag方案,考虑合并 参考[题解]P4841 城市规划(指数型母函数+多项式Ln),然 ...

随机推荐

  1. Tarjan水题系列(2):HNOI2012 矿场搭建

    题目: 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖煤点设立救援出口,使得无论哪一个挖煤点坍塌之后 ...

  2. Linux菜狗入门(不停更新)

    资料来源:<腾讯课堂> 1, 计算机硬件包括CPU,内存,硬盘,声卡等等 2, 没有安装操作系统的计算机,通常被称为裸机 如果想在裸机上运行自己所编写的程序,就必须用机器语言书写程序 如果 ...

  3. 【问题解决方案】git仓库重构

    Linux mv命令 用来为文件或目录改名.或将文件或目录移入其它位置. 语法 mv [options] source dest mv [options] source... directory 注: ...

  4. linux Apache 的安装

    rpm –qa httpd 查询是否安装了 Apache rpm –e 包名卸载安装程序 rpm –e --nodeps 包名卸载安装程序不产生依赖 #检查是否安装有依赖库 yum install – ...

  5. $strobe$monitor$display

      $strobe:当该时刻的所有事件处理完后,在这个时间步的结尾打印一行格式化的文本,语法$strobe( Argument,...);$fstrobe( Mcd, Argument,...);Mc ...

  6. STM32F407 正点原子按键输入实验

    库函数版本: 库函数 源文件 头文件 GPIO_Init(GPIOE, &GPIOE_initstructure) stm32f4xx_gpio.c stm32f4xx_gpio.h RCC_ ...

  7. html常见标签及用法整理

    <!DOCTYPE html> <!--#浏览器的兼容模式--> <html lang="en"> <head> <!--he ...

  8. STM32 JTAG接口SWD下载接线图

  9. nacos 动态刷新@ConfigurationProperties

    使用@ConfigurationProperties 可以替换@value   @ConfigurationProperties @Value 注解功能 可以批量注入配置文件中的属性 只能一个个指定注 ...

  10. Java内存模型(JMM)的可见性

    JMM(Java Memory Model)内存模型之可见性 JMM是Java内存模型的缩写,本身是一种抽象的概念,并不真实存在,它描述的是一组规则或规范,通过这组规范定义了程序中各个变量(包括实例字 ...