分析

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. arm初识

    一.CPU从指令集角度分类 1.1. CISC  (X86) 1.1. 1. CISC CPU 指complex instruction set computer复杂指令集CPU 1.1.2. CIS ...

  2. 题解 CF292A 【SMSC】

    蒟蒻本想发一篇黑题题解,没想到黑题竟然掉紫了QwQ. 趁着题解还只有几篇,赶紧来发一篇嘿嘿嘿. 这道题其实很简单,题解其实都不需要 AC代码: #include<bits/stdc++.h> ...

  3. PHP数据结构基本概念

    原文:https://www.cnblogs.com/crystaltu/p/6408484.html 学习任何一种技术都应该先清楚它的基本概念,这是学习任何知识的起点!本文是讲述数据结构的基本概念, ...

  4. [LeetCode] 132. 分割回文串 II

    题目链接 : https://leetcode-cn.com/problems/palindrome-partitioning-ii/ 题目描述: 给定一个字符串 s,将 s 分割成一些子串,使每个子 ...

  5. JavaScript如何处理JSON数据

    JSON (Javescript Object Notation)一种简单的数据格式,比xml更轻巧. JSON 是 JavaScript 原生格式,这意味着在 JavaScript 中处理 JSON ...

  6. 如何设置一个App的缓存机制

    在手机应用程序开发中,为了减少与服务端的交互次数,加快用户的响应速度,一般都会在iOS设备中加一个缓存的机制,前面一篇文章介绍了iOS设备的内存缓存,这篇文章将设计一个本地缓存的机制. 功能需求 这个 ...

  7. docker持久化之存储卷

         启动时敲:   docker run -it -v /var/mydata:/abc myos   #前面写真实机里的文件夹,冒号后面写docker里面的文件夹,最后写镜像名 (可以同时挂载 ...

  8. 配置阿里云SLB全站HTTPS集群(以下内容仅为流程,信息可能有些对应不上)

    1)登录阿里云购买两台实例 1.1) 按量付费购买两台实例 1.2) 配置网络可以不选择分配外网 1.3) 自定义密码 1.4) 购买完成 1.5) 实例列表 2)购买SLB实例 2.1)按量付费购买 ...

  9. Html5+ 开发APP 后台运行代码

    function backRunning(){ if(plus.os.name == 'Android'){ var main = plus.android.runtimeMainActivity() ...

  10. 通过virsh console进入虚拟机

    1.virsh启动一个虚拟机.执行脚本test_qga.sh 2.virsh vncdisplay <vm_ID> 3.vnc登录到vm里面,执行#systemctl start seri ...