[杂题 组合] 51Nod1934 受限制的排列
来源:互联网 发布:网管软件 编辑:程序博客网 时间:2024/05/12 07:31
不难的题。首先考虑
显然就是一个笛卡尔树的构建过程。
设
就是乘上把数分到两边的方案数。
#include<cstdio>#include<vector>#include<algorithm>#include<map>#define Fir first#define Sec second#define mp(x,y) make_pair(x,y)using namespace std;const int maxn=1000005,MOD=1e9+7;typedef long long LL;inline char gc(){ static char buf[100000],*p1=buf,*p2=buf; return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;}inline int getint(){ char ch=gc(); int res=0; while(!('0'<=ch&&ch<='9')){ if(ch==EOF) return -1; ch=gc(); } while('0'<=ch&&ch<='9') res=(res<<3)+(res<<1)+ch-'0', ch=gc(); return res;}int n,son[maxn],a[maxn],b[maxn];LL fac[maxn],inv[maxn],fac_inv[maxn]; bool pd;map< pair<int,int>,int > M;LL C(int n,int m){ return (n<m||n<0||m<0)?0:(fac[n]*fac_inv[m]%MOD*fac_inv[n-m]%MOD); }LL dfs(int L,int R){ if (L>R) return 1; int x=M[mp(L,R)]; if(!x) return 0; LL res=C(R-L,R-x); (res*=dfs(L,x-1)*dfs(x+1,R)%MOD)%=MOD; return res;}int main(){ fac[0]=1; for(int i=1;i<=1000000;i++) fac[i]=fac[i-1]*i%MOD; inv[1]=1; for(int i=2;i<=1000000;i++) inv[i]=(LL)(MOD-MOD/i)*inv[MOD%i]%MOD; fac_inv[0]=1; for(int i=1;i<=1000000;i++) fac_inv[i]=fac_inv[i-1]*inv[i]%MOD; int ii=0; while((n=getint())!=-1){ M.clear(); pd=true; for(int i=1;i<=n;i++) a[i]=getint(); for(int i=1;i<=n;i++){ b[i]=getint(); M[mp(a[i],b[i])]=i; } printf("Case #%d: %d\n",++ii,dfs(1,n)); }}
阅读全文
0 0
- [杂题 组合] 51Nod1934 受限制的排列
- 字符串的排列/组合
- 字符串的排列、组合
- 字符串的组合排列
- 字符串的组合排列(非全排列)
- 组合排列的通用算法
- 排列与组合的区别
- 组合排列的javascript算法
- 字符串的排列和组合
- 字符串的排列与组合
- 排列与组合的算法
- 字符串的排列和组合
- 排列与组合的区别
- 集合的排列与组合
- 排列与组合的实现
- 输出组合排列的方案
- 字符串的排列与组合
- 字符串的排列和组合
- docker在centos7下的一些坑
- Java-P3:工具类,继承,随机数random。
- SQL许可证有哪些问题需要考虑
- 【Android】Retrofit网络请求参数注解,@Path、@Query、@QueryMap...
- Android 仿汽车表盘view
- [杂题 组合] 51Nod1934 受限制的排列
- sso 单点登录cas使用(2): cas 4.2.7 maven cas-overlay服务端数据库配置
- hibernate对象状态
- 自定义View,环状进度条
- 框架类面试题总结
- IntelliJ IDEA Maven配置 MAC系统
- win10安装python2.7以及pip9.0.1
- [日推荐]『法条大全』小程序成法庭利器!
- C++ STL容器之vector的知识点及源码分析