Description
假设你从 (0,0) 点开始,走到 (n,n), 每次只能 x+1 或者 y+1 两种方向,要求 2n 步走到 (n,n),并且限制沿途经过的点的坐标满足 x>=y, 问有多少种解法,例如n=1,那么只有一种走法 (0,0)-(1,0)-(1,1),所以 F[1]=1; 鉴于当 n 比较大时,F[n] 很大,所以你只需要得到 F[n]%9997 即可
Input
第一行一个正整数 Case,代表多少组数据 (Case<=100)
第二行到第 Case+1 行每组数据一个整数 n; (n<=2000);
Output
一共 Case 行,每行一个整数代表方法数 F[n]%9997
Sample Input
1
1
Sample Output
1
解题思路:
典型的卡特兰数,数据比较小,用朴素的方法做
#include<iostream>
using namespace std;
const int P = 9997;
const int D = 2000;
int catalan[D+1];
void init()
{
catalan[0] = 1;
for(int i=1;i<=D;++i)
{
catalan[i] = 0;
for(int j=0;j<i;++j)
{
catalan[i] += catalan[j]*catalan[i-1-j];
catalan[i] %= P;
}
}
}
int main()
{
int T;
init();
cin>>T;
while(T--)
{
int n;
cin>>n;
cout<<catalan[n]<<endl;
}
return 0;
}
最后欢迎大家访问我的个人网站: 1024s