zoukankan      html  css  js  c++  java
  • 挖坑【卡特兰数】

        挖坑

          题目链接(点击)

    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
    ",num[n]);
        }
        return 0;
    }
    
  • 相关阅读:
    7-1 城市间紧急救援 (25 分)(最短路径:斯特拉算法)
    常见的MD5碰撞
    PHP常见绕过(更新ing)
    7-10 旅游规划 (25 分)
    杂记:用python向网页提交数据
    python学习日记
    NOIP2018提高组金牌训练营——搜索专题
    noip复习之拓扑排序
    NOIP2018提高组金牌训练营——字符串专题
    NOIP2018提高组金牌训练营——数论专题
  • 原文地址:https://www.cnblogs.com/ldu-xingjiahui/p/12407450.html
Copyright © 2011-2022 走看看