挖坑【卡特兰数】

    挖坑

      题目链接(点击)

Description
    Quasrain 和 FZ 是好朋友。Quasrain 善于挖坑而 FZ 善于填坑。
    这个游戏一共会持续 2N 天。在每一天都会有人挖坑或者填坑,并在本子上记录下“A”表示这天挖了坑,“B”表示填了坑。填坑必须填一个现存的还没有被填过的坑。
    作为素质优秀的熊孩子,他们保证在最后一天结束的时候一定会恰好填平所有坑。
    问本子上可能有多少种不同的 AB 序列
Input
    第一行一个数 T 表示数据组数(T<=100000)
    之后 T 行每行一个数 N,意义如题面所示(1<=N<=1000)

 

Output
    对于每组数据输出方案数,对 998244353 取模
Sample Input
    3
    1
    2
    3
Sample Output
    1
    2
    5
Hint
    对于第三组样例:
    可能的 AB 序列分别为:{AAABBB},{AABABB},{AABBAB},{ABAABB},{ABABAB}

思路:

这次比赛好多像这种推导公式的题目 从开始就看不出来什么规律 就像之前学斐波那契数列一样 既然考到了就记一下吧

公式如下:

        F(n)=( F(n-1)*(4*n-2) ) / n+1

因为题目中有取余的值 所以公式中的除法就没有那么简单了 我是用小费马定理求解逆元然后相乘打的表:

      求逆元的方法(点击)

1 2 5 14……

 AC代码:

#include<stdio.h>
const int MAX=1e3;
const int mod=998244353;
typedef long long LL;
LL qpow(LL m,LL q)
{
    LL ans=1;
    while(q){
        if(q%2){
            ans=ans*m%mod;
        }
        m=m*m%mod;
        q/=2;
    }
    return ans;
}
LL num[MAX+5];
LL getinv(LL n)
{
    LL num3=qpow(n,mod-2);
    return num3;
}
int main()
{
    num[1]=1,num[2]=2;
    for(LL i=3;i<=1005;i++){
        LL num1=num[i-1]*(4*i-2)%mod;
        LL num2=getinv(i+1);
        num[i]=num1*num2%mod;
    }
    LL T,n;
    for(scanf("%lld",&T);T--;){
        scanf("%lld",&n);
        printf("%lld\n",num[n]);
    }
    return 0;
}

 

posted @ 2019-04-01 17:43  XJHui  阅读(110)  评论(0编辑  收藏  举报