XDOJ1060 - 步行者

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值