牛客小白月赛1 I(逆元,卡特兰数)

这篇文章讲解了如何利用卡特兰数解决关于蛙蛙归途的问题,涉及到组合数方案数的计算,特别是通过递推公式h(n) = h(n-1)(4n-2)/(n+1)求解,并强调了在特定条件(第一个不能先出栈)下的解答调整。通过实例展示了算法实现和输出格式。
摘要由CSDN通过智能技术生成

あなたの蛙が帰っています

题目链接
这道题是考卡特兰数的

题目描述在这里插入图片描述

输入描述:

第一行一个数 T ,表示蛙蛙有 T 组询问。
接下去 T 行,每行一个正整数 N, 表示目的地的个数(入栈元素个数)。
1≤T≤200
1≤N≤10^5

输出描述

输出共 TT 行,每行一个答案,格式形如Case #1: 3 ,具体可见样例。
答案可能较大,请对 998244353 取模后输出。

输入样式

3
3
9
24

输出样式

Case #1: 3
Case #2: 3432
Case #3: 508887030

算法分析

这个题用到了卡特兰数,卡特兰数主要用于求组合数的方案数,规律是1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796,他可以求,矩阵连乘的方案数,栈的出栈序列,n个结点构成的二叉树有几种情况…
卡特兰数的常见问题
卡特兰数的求解
(1) h(n)= h(0)h(n-1)+h(1)h(n-2) + … + h(n-1)h(0) (n>=2)
(2) h(n)=h(n-1)
(4
n-2)/(n+1)
(3) h(n)=C(2n,n)/(n+1) (n=0,1,2,…)
(4) h(n)=c(2n,n)-c(2n,n+1)(n=0,1,2,…)
程序中用的是第二种,题目中的数很大要用到求余
1 (a + b) % p = (a % p + b % p) % p
2(a - b) % p = (a % p - b % p) % p
3(a * b) % p = (a % p * b % p) % p
4.a ^ b % p = ((a % p)^b) % p
这其中没有a/b%p;
a/b%p要用到逆元来求解逆元中的费马小定理推出来
(b/a)%m 可以变成 ba^(m-2)%m
当m较大时,要用到快速幂
所以这道题的最终就是h(n)=h(n-1)(4
n-2)/(n+1)取余
kt[i]=kt[i-1](4i-2)%mod*ksm(i+1,mod-2)%mod;
题目还说第一个不能先出栈
所以答案要减去kt[i-1] (在第一个出去的情况下剩余的排列方式)

代码实现

#include<iostream>
#include<math.h>
#include<algorithm>
#include<cstdio>
#include<cstring>
#define mod 998244353
using namespace std;
typedef long long ll;
const int maxn=1e5+5;
ll kt[maxn]={0,1};
ll ksm(ll a,ll b)//快速幂为了求((4*n-2)/(n+1))%mod==>(4*n-2)%mod*ksm(n+1,mod-2)%mod;
{
    ll ans=1;
    while(b)
    {
        if(b%2)
            ans=ans*a%mod;
        a=a*a%mod;
        b>>=1;
    }
    return ans;
}
void inti()//求卡特兰数组
{
    for(int i=2;i<=100000;i++)
    {
        kt[i]=kt[i-1]*(4*i-2)%mod*ksm(i+1,mod-2)%mod;
    }
}
int main()
{
    inti();
    int t;
    cin>>t;
    int x;
    for(int i=1;i<=t;i++)
    {
        cin>>x;
        printf("Case #%d: ",i);
        if(x==1)
            cout<<0<<endl;
        else
            cout<<(kt[x]-kt[x-1]+mod)%mod<<endl;
    }
}
根据用户提供的关键词“小A 弹吉他 牛客牛客网 小白 108 比详情 参攻略”,以下是整合后的相关信息和建议: --- ### 关于小白108的比详情 小白是由牛客网主办的一系列面向编程爱好者的在线竞之一。第108场事通常会围绕算法据结构以及实际问题解决能力展开挑战。比题目可能涉及但不限于字符串处理、动态规划、图论等领域。 对于与“小A弹吉他”相关的具体题目,可能是某道以音乐或乐器为主题的趣味性算法题。这类题目往往需要结合学建模能力和逻辑推理技巧来完成解答。 --- ### 如何准备此类比? #### 方法一:熟悉常见算法模板 确保掌握基础的据结构(如栈、队列)及经典算法模型(例如深度优先搜索DFS、广度优先搜索BFS)。针对可能出现的音符序列匹配或者节奏计算等问题提前复习KMP模式匹配法等相关知识点。 #### 方法二:模拟真实考场环境练习 利用过往的小白记录进行刷题训练,在规定时间内尝试独立解决问题从而提升临场发挥水平。同时注意控制提交频率避免因超时错误而扣分过多。 #### 方法三:学习优秀选手思路分享 访问牛客社区查看往届高排名玩家的经验贴。他们可能会提到如何快速理解复杂描述型试题的方法论;也可能提供一些特别好用但容易被忽略掉的小技巧比如调试输出设置等细节优化方案。 --- ### 示例代码片段供参考(假设存在一个简单版本的问题) 如果遇到类似判断两个旋律是否相同类型的程序设计,则可以考虑如下实现方式: ```python def is_same_melody(melody_a, melody_b): return melody_a == melody_b melody_A = list(map(int, input().split())) melody_B = list(map(int, input().split())) if len(melody_A) != len(melody_B): print("No") else: if is_same_melody(melody_A,melody_B): print("Yes") else: print("No") ``` 此段落仅为示意用途,请依据实际情况调整适应不同难度等级下的业务场景需求。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值