杭电4828 Grids(卡特兰数+求逆元)

来源:互联网 发布:淘宝卖大米要什么手续 编辑:程序博客网 时间:2024/05/16 00:25

Grids

Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)
Total Submission(s): 423    Accepted Submission(s): 168


Problem Description
  度度熊最近很喜欢玩游戏。这一天他在纸上画了一个2行N列的长方形格子。他想把1到2N这些数依次放进去,但是为了使格子看起来优美,他想找到使每行每列都递增的方案。不过画了很久,他发现方案数实在是太多了。度度熊想知道,有多少种放数字的方法能满足上面的条件?
 

Input
  第一行为数据组数T(1<=T<=100000)。
  然后T行,每行为一个数N(1<=N<=1000000)表示长方形的大小。
 

Output
  对于每组数据,输出符合题意的方案数。由于数字可能非常大,你只需要把最后的结果对1000000007取模即可。
 

Sample Input
213
 

Sample Output
Case #1:1Case #2:5
Hint
对于第二组样例,共5种方案,具体方案为:
 

Source
2014年百度之星程序设计大赛 - 初赛(第一轮) 
/*逆元的简单运用。。。我去,2015年刚来了。。已经2月份了、。、Time:2015-2-1 0:08*/#include<cstdio>#include<cstring>#include<algorithm>using namespace std;typedef long long LL;const LL mod=1000000007;const int MAX=1000000+10;LL gcd;void ex_gcd(LL a,LL b,LL &x,LL &y){    if(b==0){        x=1;y=0;        gcd=a;        return;    }    ex_gcd(b,a%b,y,x);    y-=a/b*x;}LL INV(LL a,LL n){    LL x,y;    ex_gcd(a,n,x,y);    //ax+ny=1 x即为逆元    return (x+n)%n;}LL buf[MAX];void Catalan(int n){    buf[0]=1;buf[1]=1;    for(LL i=2;i<=n;i++){        buf[i]=(((buf[i-1]*((i<<2)-2))%mod)*INV(i+1,mod))%mod;    }}int main(){    int T,n,nCase=1;    scanf("%d",&T);    Catalan(MAX-9);    while(T--){        scanf("%d",&n);        printf("Case #%d:\n",nCase++);        printf("%lld\n",buf[n]);    }return 0;}

0 0
原创粉丝点击