给定个n * m的矩阵,定义矩阵第i行、第j列的值为gcd(i,j),定义一个子矩阵的和是其中所有元素之和,怎么求所有 k*k的子矩阵的和的总和。用C++代码写出求和的方法
时间: 2023-03-26 21:01:34 浏览: 188
以下是 C 代码实现:
#include <stdio.h>
int gcd(int a, int b) {
if (b == ) {
return a;
}
return gcd(b, a % b);
}
int main() {
int n, m, k;
scanf("%d %d %d", &n, &m, &k);
long long sum = ;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
int g = gcd(i, j);
int r = (i / g) * (j / g);
sum += r * (k - 1) * (k - 1);
}
}
printf("%lld\n", sum);
return ;
}
解释一下代码的思路:
首先,我们需要一个函数来计算两个数的最大公约数,这里使用了辗转相除法。
然后,我们读入矩阵的大小 n 和 m,以及子矩阵的大小 k。
接下来,我们遍历矩阵中的每个元素,计算它与其它元素的最大公约数,并计算出它所在的子矩阵中每个元素的贡献,即 (i/gcd(i,j)) * (j/gcd(i,j)) * (k-1) * (k-1)。
最后,将所有子矩阵的贡献相加,得到总和。
注意,由于子矩阵的大小可能很大,所以需要使用 long long 类型来存储总和。
阅读全文