正经题解
2026-03-31 19:46:52
发布于:浙江
问题深度解析
核心规则梳理
问题本质:遍历二维数组中的所有元素,统计能被m整除的元素个数。
关键注意事项:
数组元素范围很大(1≤Aᵢⱼ≤10⁹),但取模运算对大整数依然有效
n最大为1000,数组总元素数为1e6,需要高效处理
m最大为100,取模运算的开销很小
#include <iostream>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, m;
cin >> n >> m;
int cnt = 0; // cnt表示符合条件的元素个数
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
long long x; // x存储数组元素,避免溢出
cin >> x;
if (x % m == 0) { // 判断是否是m的倍数
cnt++;
}
}
}
cout << cnt << endl;
return 0;
}
更高效的版本(批量读取)
#include <iostream>
#include <cstdio>
using namespace std;
int main() {
int n, m;
scanf("%d%d", &n, &m);
int cnt = 0;
for (int i = 0; i < n*n; ++i) {
long long x;
scanf("%lld", &x);
if (x % m == 0) cnt++;
}
printf("%d\n", cnt);
return 0;
}
代码详细解释
关键变量说明
变量名 类型 作用
n int 二维数组的大小
m int 要寻找的倍数
cnt int 统计符合条件的元素个数
x long long 存储数组元素,避免输入大整数时溢出
核心优化点
快速IO优化:
ios::sync_with_stdio(false);
cin.tie(nullptr);
关闭C++流与C流的同步,加速输入输出
对于n=1000的情况,能显著减少IO时间
数据类型选择:
long long x;
因为Aᵢⱼ最大可以是10⁹,虽然int可以存储(int最大约2e9),但使用long long更安全,避免潜在的溢出问题
循环优化:
for (int i = 0; i < n*n; ++i) {
// ...
}
将二维循环改为一维循环,减少循环嵌套层次,提高缓存命中率(对现代CPU影响较小,但代码更简洁)
输入输出示例验证
示例输入1:
2 5
1 5
1 10
遍历数组元素:1,5,1,10
判断是否是5的倍数:5和10是,共2个
输出结果:2,与示例一致
复杂度分析
复杂度 分析
时间复杂度 O(n²)
空间复杂度 O(1)
性能分析
对于n=1000,总元素数为1e6次操作,完全在时间限制内
取模运算的时间复杂度是O(1),非常高效
IO操作是主要的时间开销,使用快速IO或scanf/printf可以显著提高速度
边界测试用例
输入 输出 说明
1 1
1000000000 1 m=1时,所有数都是1的倍数
1000 100
(1e6个100) 1000000 所有元素都是m的倍数
1000 99
(1e6个1) 0 所有元素都不是m的倍数
1000 2
(1e6个交替的奇数和偶数) 500000 一半元素是m的倍数
这里空空如也




有帮助,赞一个