数学

青蛙旅行
卡特兰数
https://ac.nowcoder.com/acm/contest/8417/I
对于n个数的序列,其出战方案数多少种,设为H(n)。如果序列中第k个数是最后一个出栈的,则k进栈前,其前(k-1)个元素均已出栈,前(k-1)个元素出栈的序列有H(k-1)种,第k个数出栈前,其后(n-k)个元素均已出栈,它们的出栈方案数有H(n-k)种。则第k个元素为最后一个出栈元素对应的出栈方案数为H(k-1)H(n-k),k又可以取遍1~n,所以可得。H(n) = H(0)H(n-1)+H(1)H(n-2)...H(n-1)H(1)H(n-1)H(0);题目要求第一个进栈的元素,不能第一个出,则在H(n)种方案中,只有A1进A1出和剩余n-1个元素入栈出栈的情况组合是不符合要求的。则答案就是H(n)-H(n-1).H(n)还有这种表方法:H(n) = C(2n,n)/(n+1);由于该题目牵涉到除法,所以还需要求乘法逆元,题目给出的模是素数,则可以用小费马定理求乘法逆元。

#include<bits/stdc++.h>
#define ios ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define ll long long
const int N=1e6+5;
const int mod=998244353;
using namespace std;
ll f[N];
void inif(){
    f[0]=1;
    f[1]=1;
    for(int i=2;i<N;i++){
        f[i]=f[i-1]*i%mod;
    }
}
ll pw(ll x,ll p){
    x=x%mod;
    ll ans=1;
    while(p>0){
        if(p&1)ans=ans*x%mod;
        x=x*x%mod;
        p>>=1;
    }
    return ans;
}
ll catelan(int n){
    ll p1=pw(f[n]*f[n]%mod,mod-2);//组合数不是排列
    ll p2=pw(n+1,mod-2);
    return f[2*n]*p1%mod*p2%mod;
}
int main()
{
    ios;
    inif();
    int t;
    int Case=1;
    cin>>t;
    while(t--){
        int n;
        cin>>n;
        int t=n-1;
        ll h1=(catelan(n)-catelan(n-1)+mod)%mod;
        printf("Case #%d: %lld\n",Case++,h1);
    }
}

洛谷p2241
https://www.luogu.com.cn/problem/P2241
题目背景
1997年普及组第一题

题目描述
有一个 n \times mn×m 方格的棋盘,求其方格包含多少正方形、长方形(不包含正方形)。

输入格式
一行,两个正整数 n,mn,m(n \leq 5000,m \leq 5000n≤5000,m≤5000)。

输出格式
一行,两个正整数,分别表示方格包含多少正方形、长方形(不包含正方形)。

输入输出样例
输入
2 3
输出
8 10
图片说明

全部评论

相关推荐

牛客737698141号:他们可以看到在线简历的。。。估计不合适直接就拒了
点赞 评论 收藏
分享
牛客279957775号:铁暗恋
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务