试题 E: 矩阵
本题总分:15 分
【问题描述】
把 1 ∼ 2020 放在 2 × 1010 的矩阵里。要求同一行中右边的比左边大,同一列中下边的比上边的大。一共有多少种方案?
答案很大,你只需要给出方案数除以 2020 的余数即可。
【答案提交】
这是一道结果填空题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
#include <iostream>
using namespace std;
int dp[2021][2021];
int main() {
int n = 2020;
dp[1][1] = 1; // 1必然放在第一行
// 只要保证第一行的数比第二行的数多就可以了,后面的数会越来越大,会符合小到大的规律
for (int i = 2; i <= n; i++)
for (int j = 1; j <= i; j++) {
dp[i][j] += dp[i - 1][j - 1];
if (i - j <= j)
// 当进入if说明,i没有超过j的两倍了(如果i超过j的两倍,说明第一行肯定比第二行少了)
// 本身就是取一半的数字,如果超过两倍,说明取不到一半,不能参与计算
dp[i][j] += dp[i - 1][j];// 放到第二层
dp[i][j] %= 2020;
}
printf("%d\n", dp[2020][1010]);
return 0;
}
ans:1340
试题 F: 整除序列
时间限制: 1.0s 内存限制: 256.0MB 本题总分:15 分
【问题描述】
有一个序列,序列的第一个数是 n,后面的每个数是前一个数整除 2,请输出这个序列中值为正数的项。
【输入格式】
输入一行包含一个整数 n。
【输出格式】
输出一行,包含多个整数,相邻的整数之间用一个空格分隔,表示答案。
【样例输入】
20
【样例输出】