wannafly 挑战赛9 D 造一造 (卡特兰数)
链接:https://www.nowcoder.com/acm/contest/71/D
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
64bit IO Format: %lld
题目描述
WYF正试图用一个栈来构造一棵树,现在他已经构造了n个元素作为树的节点,只要将这n个元素依次入栈出栈就可以形成一棵树了。当然,这个问题与树并没有关系,所以它叫做WYF的栈。每次你可以入栈一个新元素或者当栈非空时出栈一个元素,n个元素必须依次入栈,而WYF希望其中第m个元素入栈之后,栈中恰好有k个元素,现在他想知道一共有多少种入栈出栈顺序满足这个条件。
输入描述:
第一行一个正整数T,表示数据组数。(1<=T<=10000)
对于每组数据包含一行三个正整数n,m,k。
输出描述:
对于每组数据输出一个正整数表示答案。
由于答案可能过大,所以只需要输出对109+7取模后的答案
示例1
输入
2 3 3 3 3 3 2
输出
1 2
示例2
输入
5 10 3 2 10 2 2 10 7 5 10 6 2 10 7 6
输出
6864 11934 2200 3780 924
示例3
输入
2 5 4 4 5 2 1
输出
5 14
备注:
1<=n,m,k<=1e9
////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
很难受,结束完才ac
放一下自己看的卡特兰数的讲解 http://blog.csdn.net/qq_26525215/article/details/51453493 (侵删)
1 #include <bits/stdc++.h> 2 #define mst(a,b) memset((a),(b), sizeof a) 3 #define lowbit(a) ((a)&(-a)) 4 #define IOS ios::sync_with_stdio(0);cin.tie(0); 5 using namespace std; 6 typedef long long ll; 7 const int mod=1e9+7; 8 const int maxn=2e6+10; 9 ll jie[maxn],inv[maxn]; 10 ll qpow(ll a,ll b){ 11 ll ret=1; 12 while(b){ 13 if(b&1)ret=ret*a%mod; 14 b>>=1; 15 a=a*a%mod; 16 } 17 return ret; 18 } 19 void init(){ 20 jie[0]=inv[0]=1; 21 for(int i=1;i<maxn;++i){ 22 jie[i]=jie[i-1]*i%mod; 23 inv[i]=qpow(jie[i],mod-2); 24 } 25 } 26 ll C(int a,int b){ 27 return jie[a]*inv[b]%mod*inv[a-b]%mod; 28 } 29 ll get(int a,int b){ 30 return (C(a+b,b)-C(a+b,b-1)+mod)%mod; 31 } 32 int main(){ 33 #ifdef local 34 freopen("in.txt","r",stdin); 35 //freopen("out.txt","w",stdout); 36 #endif 37 init(); 38 int t;scanf("%d",&t); 39 while(t--){ 40 int n,m,k;scanf("%d%d%d",&n,&m,&k); 41 if(m<k){ 42 printf("%d\n",0);continue; 43 } 44 ll ans=get(m-1,m-k)*get(k+n-m,n-m)%mod; 45 printf("%lld\n",ans); 46 } 47 return 0; 48 }