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

news/2025/2/26 9:50:15

【题目来源】
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)。

【算法代码】

#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/
 


http://www.niftyadmin.cn/n/5868505.html

相关文章

ChatGPT免费背后的技术暗战 国产数字孪生如何打造“虚实共生”新生态?

当ChatGPT搜索功能向全球免费开放&#xff0c;AI技术的平民化时代正式来临。在这场看似“让利”的商业策略背后&#xff0c;实则是全球科技话语权的重新洗牌。国产厂商如何在这场博弈中占据主动&#xff1f;数字孪生技术的场景化落地提供了破局方向。据中国信通院认证&#xff…

TCP,http,WebSocket

TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09;和HTTP&#xff08;HyperText Transfer Protocol&#xff0c;超文本传输协议&#xff09;都是网络通信中的重要协议&#xff0c;但它们在网络协议栈的不同层次上工作&#xff0c;各自负责不同…

校园的网络安全

&#x1f345; 点击文末小卡片 &#xff0c;免费获取网络安全全套资料&#xff0c;资料在手&#xff0c;涨薪更快 1、什么是端口安全 端口安全&#xff08;Port Security&#xff09;&#xff0c;从基本原理上讲&#xff0c;Port Security特性会通过MAC地址表记录连接到交换机…

ReentrantLock 用法与源码剖析笔记

&#x1f4d2; ReentrantLock 用法与源码剖析笔记 &#x1f680; 一、ReentrantLock 核心特性 &#x1f504; 可重入性&#xff1a;同一线程可重复获取锁&#xff08;最大递归次数为 Integer.MAX_VALUE&#xff09;&#x1f527; 公平性&#xff1a;支持公平锁&#xff08;按等…

Linux之loop设备(Loop Devices in Linux)

Linux之loop设备 在Linux/Unix系统中&#xff0c;loop设备是一项非常实用的技术&#xff0c;它允许我们将普通文件作为块设备来使用。今天&#xff0c;让我们深入了解loop设备的工作原理及其应用场 一、Loop设备概述 Loop设备(loop device)是一种虚拟块设备&#xff0c;它能…

JS宏进阶:浅谈曲线回归

曲线回归是一种统计学方法,用于研究两个或多个变量之间的非线性关系,并找到最能拟合数据点的曲线函数形式。与线性回归不同,曲线回归适用于描述那些不是直线性的变量关系。通过曲线回归,可以建立变量之间的非线性数学模型,用于预测和解释各种实际现象。 一、基本概念 定…

EX_25/2/25

编写一个如下场景&#xff1a; 有一个英雄Hero类&#xff0c;私有成员&#xff0c;攻击&#xff0c;防御&#xff0c;速度&#xff0c;生命值&#xff0c;以及所有的set get 方法 编写一个 武器 Weapon 类&#xff0c;拥有私有成员攻击力&#xff0c;以及set get 方法 编写一个…

fps项目总结:网格体

文章目录 网格体碰撞物理&#xff1a;穿模时弹开 角色组件碰撞&#xff1a;角色网格体要触发命中则双方必须有一方开启物理模拟。组件开启物理将不再跟随根节点变换&#xff0c;且成为场景中的根节点。 网格体 碰撞 物理&#xff1a;穿模时弹开 角色组件 碰撞&#xff1a;角…