题目
题目描述
现在工地上有各种大小的钢管(钢管的横截面看做是矩形的,长宽均为整数),数量无限。选用
n
n
n个钢管来搭建高度为
n
n
n的阶梯。你搭建的阶梯必须满足
1
1
1到
n
n
n层的高度为
1
,
2
,
3
,
⋯
,
n
1,2,3,\cdots,n
1,2,3,⋯,n。
上方
↑
\uparrow
↑是钢管的示意图。
钢管只能(如图
↑
\uparrow
↑方法)水平放置。
现在你需要计算出有多少种方法来搭建阶梯,你只需要输出答案 m o d 9999991 \bmod 9999991 mod9999991后的结果。
输入输出格式
输入格式
本题包含多组测试数据。
第一行包含一个整数
T
T
T表示测试组数。
接下来第
2
,
3
,
4
,
⋯
,
T
+
1
2,3,4,\cdots,T+1
2,3,4,⋯,T+1行,每行一个整数
n
n
n,表示你需要搭建的高度以及使用的钢管数量。
输出格式
共
T
T
T行,每行一个整数,表示方案数。
数据范围和约定
测试点编号 | T T T | n n n |
---|---|---|
1 , 2 , 3 1,2,3 1,2,3 | ≤ 1 \le 1 ≤1 | ≤ 5 \le 5 ≤5 |
4 , 5 , 6 , 7 , 8 4,5,6,7,8 4,5,6,7,8 | ≤ 1000 \le 1000 ≤1000 | ≤ 1 0 5 \le 10^5 ≤105 |
9 , 10 9,10 9,10 | ≤ 1000 \le 1000 ≤1000 | ≤ 1 0 16 \le 10^{16} ≤1016 |
思路
感觉是三维,其实就是用矩形覆盖二维平面。
其实百度一下就知道,这玩意儿是咳咳咳的经典例题……
只有 n n n个钢管,却要搞定 n n n层阶梯。
而且每一层最右边的位置,任意两个都不能被同一块砖覆盖。
所以 每块砖一定覆盖一个角(即每一层最右边的位置)。
考虑覆盖左下角的砖覆盖了哪个角。
(虽然图有点粗糙,可以看题目描述里的图)成功发现子问题!
由乘法原理, f ( n ) = ∑ x = 0 n − 1 f ( x ) f ( n − 1 − x ) f(n)=\sum_{x=0}^{n-1}f(x)f(n-1-x) f(n)=∑x=0n−1f(x)f(n−1−x)。 Catalan \text{Catalan} Catalan数!
n n n太大,怎么办? Lucas \text{Lucas} Lucas定理!
真是一道题复习两个知识点啊……
代码
#include <iostream>
int main(){
std::cout << "咕咕咕……" << std::endl;
return 0;
}