1. 题目解析与思路拆解
这道蓝桥杯省赛题目要求我们判断给定的正整数能否表示为至少3个连续整数的和。乍看简单,但其中蕴含着不少数学技巧和编程优化点。
1.1 问题本质理解
题目中的"可分解正整数"实际上是指能表示为等差数列(公差为1)的和。例如:
- 6 = 1 + 2 + 3
- 15 = 4 + 5 + 6
- 3 = 0 + 1 + 2
关键约束条件:
- 序列长度n ≥ 3
- 序列必须是连续整数(可包含负数和零)
1.2 数学建模过程
设序列起始数为k,长度为n,则和为:
S = k + (k+1) + ... + (k+n-1) = n*(2k + n - 1)/2
变形得到:
2S = n*(2k + n - 1)
这里n和(2k + n - 1)都是整数,且n ≥ 3。我们需要找到满足这个等式的整数解。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心算法实现
2.1 关键函数设计
c复制int is_decomposable(int S) {
long long T = 2LL * S;
for (long long n = 1; n * n <= T; n++) {
if (T % n != 0) continue;
// 检查n作为长度的情况
if (n >= 3) {
long long m = T / n;
if ((m - n + 1) % 2 == 0) {
return 1;
}
}
// 检查T/n作为长度的情况
long long n2 = T / n;
if (n2 >= 3 && n2 != n) {
long long m2 = n;
if ((m2 - n2 + 1) % 2 == 0) {
return 1;
}
}
}
return 0;
}
2.2 算法优化点
- **约
