6 条题解
-
36
方法①:暴力(俗话说的好,暴力出奇迹)
#include <bits/stdc++.h> using namespace std; int main() { int sum, m; while (cin >> m) { for (int i = 1, j; 2 * i < m; ++i) { sum = 0; for (j = i; j < m; j += 1) { sum += j; if (sum >= m) { break; } } if (sum == m) { cout << i << " " << j << endl; } } cout << endl; } return 0; }//已AC
方法②:前缀和(从暴力的基础上修改,暴力的内层循环使用前缀和简化)
#include <bits/stdc++.h> using namespace std; int s[2000005], m; int main() { while(~scanf("%d", &m)) { for(int i = 1; i <= m; i++) { s[i] = s[i - 1] + i; } for(int i = 1; i < m; i++) { for(int j = i + 1; s[j] - s[i - 1] <= m; j++) { if(s[j] - s[i - 1] == m) { cout << i << " " << j <<endl; } } } } return 0; }//已AC
方法③:数学运算(设首项为,末项为,那么,即。可以把分解成两个数之积,假设分成了两个数,且,可以列一个二元一次方程组,,解得, ,当一奇一偶时,才有自然数解。不过有一种特殊情况,就是的情况,这种情况是不允许的,即,解得)。
#include <bits/stdc++.h> using namespace std; int main() { int m; while (~scanf("%d", &m)) { for(int i = sqrt(2 * m); i > 1; i--) { if(2 * m % i == 0 && (i + 2 * m / i) % 2) { int j = 2 * m / i; printf("%d %d\n", (j - i + 1) / 2, (i + j - 1) / 2); } } puts(""); } return 0; }//已AC
题解制作不易,点个赞再走呗
-
1
#include <bits/stdc++.h> using namespace std; int main() { int num, m; while (cin >> m) { for (int i = 1, j; 2 * i < m; ++i) { num = 0; for (j = i; j < m; j += 1) { num += j; if (num >= m) { break; } } if (num == m) { cout << i << " " << j << endl; } } cout << endl; } return 0; } //已AC~~
- 1
信息
- ID
- 1116
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 4
- 标签
- 递交数
- 1004
- 已通过
- 459
- 上传者