洛谷 P8705:[蓝桥杯 2020 省 B1] 填空题之“试题 E :矩阵” ← 卡特兰数

【题目来源】
https://www.luogu.com.cn/problem/P8705

【题目描述】
把 1∼2020 放在 2×1010 的矩阵里。要求同一行中右边的比左边大,同一列中下边的比上边的大。一共有多少种方案?
答案很大,你只需要给出方案数除以 2020 的余数即可。

【答案提交】
这是一道结果填空题,你只需要算出结果后提交即可。
本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

【算法分析】
● 卡特兰数(Catalan number)是组合数学中一个常出现在各种计数问题中的数列。若从第 0 项开始,则卡特兰数列 h[n] 为:1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440, 9694845, 35357670, 129644790, ...。

● 常用的卡特兰数列 h[n] 有如下 4 种等价的递推式
h[n]=h[0]*h[n−1]+h[1]*h[n−2]+...+h[n−1]*h[0], (n≥2, h[0]=h[1]=1)
h[n]=h[n−1]*(4*n−2)/(n+1), (n≥2)
h[n]=C(2n,n)−C(2n,n−1), (n=0,1,2,...)
h[n]=C(2n,n)/(n+1), (n=0,1,2,...)

● 卡特兰数的第 20 项为 6564120420,大于 2×10^9,所以代码中要声明为 long long 型。

● 矩阵填充与进栈出栈过程的对应关系以及和卡特兰数的联系
(1)第一行填充对应进栈:当我们从左到右填充矩阵的第一行时,每放入一个数字,就相当于一个元素进栈。因为第一行的数字是依次增大的,就好像元素依次进入栈中,且栈内元素是按照进栈顺序依次排列(从小到大)。
(2)第二行填充对应出栈:当我们开始填充矩阵的第二行时,由于要满足同一列下边的数字比上边大,所以放入第二行的数字必须是已经在第一行出现过的数字,这就类似于元素出栈。

(3)可以将进栈(push)操作看作在平面直角坐标系中向沿 x 轴正向走一步,出栈(pop)操作看作沿 y 轴正向走一步。要完成 n 个元素的进栈和出栈操作,最终需要从原点(0,0)走到点(n,n)。但由于合法的进栈出栈序列要求在任何时刻出栈次数不超过进栈次数,所以对应的路径不能穿过直线 y=x,只能在直线 y=x 及其下方行走。最终,可得合法的出栈序列数就是卡特兰数的第 n 项:h[n]=h[0]*h[n−1]+h[1]*h[n−2]+...+h[n−1]*h[0], (n≥2, h[0]=h[1]=1)。

【算法代码】

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;

const int maxn=2e5+5;
long long c[maxn];
int n;

int main() {
    cin>>n; //n=1010
    c[0]=1,c[1]=1;
    for(int i=2; i<=n; i++) {
        for(int j=0; j<=i-1; j++) {
            c[i]+=c[j]*c[i-j-1];
            c[i]%=2020;
        }
    }

    cout<<c[n];

    return 0;
}

/*
in:1010
out:1340
*/

【参考文献】
https://blog.csdn.net/hnjzsyjyj/article/details/145830268
https://blog.csdn.net/hnjzsyjyj/article/details/145842440
https://blog.csdn.net/hnjzsyjyj/article/details/129148916
https://www.acwing.com/file_system/file/content/whole/index/content/3766019/

相关推荐
前端世界3 小时前
从零实现一个可加减的Matrix矩阵类:支持索引、相等判断与实际场景应用
线性代数·矩阵
Java_小白呀19 小时前
第十四届蓝桥杯大赛软件赛国赛Java大学C组(部分)
职场和发展·蓝桥杯·1024程序员节
py有趣1 天前
LeetCode学习之0矩阵
学习·leetcode·矩阵
.ZGR.2 天前
蓝桥杯高校新生编程赛第一场题解——Java
java·算法·蓝桥杯
郝学胜-神的一滴2 天前
Cesium绘制线:从基础到高级技巧
前端·javascript·程序人生·线性代数·算法·矩阵·图形渲染
漫漫不慢.2 天前
蓝桥杯-16955 岁月流转
java·jvm·蓝桥杯
前端小L2 天前
动态规划的“升维”之技:二维前缀和,让矩阵查询“降维打击”
线性代数·矩阵
爱学习的小鱼gogo3 天前
pyhton 螺旋矩阵(指针-矩阵-中等)含源码(二十六)
python·算法·矩阵·指针·经验·二维数组·逆序
智能化咨询3 天前
矩阵的奇异值分解(SVD)核心原理与图形学基础应用
矩阵
西***63473 天前
从信号处理到智能协同:高清混合矩阵全链路技术拆解,分布式系统十大趋势抢先看
网络·分布式·矩阵