分析

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. 大div中,三个小div水平居中

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. letsencrypt 免费SSL证书申请, 自动更新

    Let's Encrypt 泛域名 证书申请 及自动更新 关键字:SSL证书.HTTPS 初次申请 1. 下载certbot wget https://dl.eff.org/certbot-auto ...

  3. jQuery之筛选方法

    1. 父parent.子children.find <div class="yeye"> <div class="father"> &l ...

  4. 剑指offer 分行从上到下打印二叉树

    题目: 从上到下按层打印二叉树,同一层的节点按照从左到右的顺序打印,每一层打印到一行. /* struct TreeNode { int val; struct TreeNode *left; str ...

  5. Dva框架从初识到上手

    引言 最近工作需要用dva框架,同事帮我培训了一下,有一点点认识,在此总结. 当然,以后对dva可能会了解更透彻,文章会不断更新的.   初识 开始看架构代码,没有看文档的时候,不知道里面的几个关键字 ...

  6. 记录一次TabBar使用本地图片

    方法一: 第一步:import  addpng  from '../../assets/img/add.png' 第二步: { title: '找折扣', image: addpng}, 即可. 方法 ...

  7. Nginx 编译安装工程优化

    1.减小 nginx 编译后的文件大小 在编译 nginx 时,默认以 debug 模式进行,在 debug 模式下会插入很多跟踪和 assert 之类的信息. 在 nginx 源码文件解压后,找到源 ...

  8. flockfile, ftrylockfile, funlockfile - 为标准输入输出锁定文件 FILE

    SYNOPSIS 总览 #include <stdio.h> void flockfile(FILE *filehandle); int ftrylockfile(FILE *fileha ...

  9. PAT Advanced 1046 Shortest Distance (20 分) (知识点:贪心算法)

    The task is really simple: given N exits on a highway which forms a simple cycle, you are supposed t ...

  10. The Preliminary Contest for ICPC Asia Xuzhou 2019 E. XKC's basketball team (线段树)

    题目链接:https://nanti.jisuanke.com/t/41387 题目大意:对于给定序列,求出对于每个位置求出比该数大于m的最靠右的位置. 思路:首先对序列进行离散化,然后对于每个数的下 ...