1 条题解
-
0
分析题意与解题方法
题目背景
给定一个二维数组
arr
和两个变量k
和n
,程序通过多次嵌套循环计算了数组中某些元素的值,并最终输出某个特定列的总和。
代码功能分解
初始化部分 (
ini()
函数)- 定义了一个二维数组
arr
,大小为 。 - 清空数组的所有元素为 。
- 嵌套循环填充数组的部分值:
- 第二行 () 的每个元素通过公式 累加。
- 第三行 () 的每个元素通过公式 $\text{arr}[3][i] += (\min(i, j) + 1) \cdot \text{arr}[2][j]$ 累加。
- 第四行 () 的每个元素通过公式 $\text{arr}[4][i] += (\min(i, j) + 1) \cdot \text{arr}[3][j]$ 累加。
主函数部分
- 循环读取输入的 和 ,直到文件结束。
- 调用
ini()
函数初始化数组。 - 计算第 行所有元素的总和,并输出结果。
关键公式推导
第二行计算
$$\text{arr}[2][i] = \sum_{j=0}^{k-1} (\min(i, j) + 1) $$解释:
- 对于固定的 , 表示 和 中较小的那个值,加上 后累加。
第三行计算
$$\text{arr}[3][i] = \sum_{j=0}^{k-1} (\min(i, j) + 1) \cdot \text{arr}[2][j] $$解释:
- 第三行依赖第二行的结果,通过逐项乘积后求和。
第四行计算
$$\text{arr}[4][i] = \sum_{j=0}^{k-1} (\min(i, j) + 1) \cdot \text{arr}[3][j] $$解释:
- 第四行依赖第三行的结果,同样通过逐项乘积后求和。
总和计算
最终需要计算第 行的总和:
解题方法总结
- 输入解析:每次读取 和 。
- 初始化数组:调用
ini()
函数,按公式逐步填充数组。 - 计算总和:对第 行的所有元素求和并输出。
示例运行
假设输入如下:
2 3
程序会依次计算 ,然后输出第 行的总和。
代码展示
#include <cstdio> #include <cstring> #include <iostream> #define Min(a1, b1) ((a1) > (b1) ? (b1) : (a1)) using namespace std; const int Maxn = 5010; long long arr[5][Maxn]; int k, n; void ini() { memset(arr, 0, sizeof(arr)); for (int i = 0; i < k; ++i) { for (int j = 0; j < k; ++j) { arr[2][i] += Min(i, j) + 1; } } for (int i = 0; i < k; ++i) { for (int j = 0; j < k; ++j) { arr[3][i] += (Min(i, j) + 1) * arr[2][j]; } } for (int i = 0; i < k; ++i) { for (int j = 0; j < k; ++j) { arr[4][i] += (Min(i, j) + 1) * arr[3][j]; } } } int main(void) { while (scanf("%d%d", &n, &k) != EOF) { ini(); long long sum = 0; for (int i = 0; i < k; ++i) { sum += arr[n][i]; } cout << sum << endl; } return 0; }
- 定义了一个二维数组
- 1
信息
- ID
- 1159
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者