|
|
发表于 2023-11-24 21:56:10
|
显示全部楼层
本帖最后由 tommyyu 于 2023-11-24 21:59 编辑
你这种做法不一定能找到答案,可以用二元二次方程。
由题意得,x + (x+1) +... +y = m
而 x + (x+1) + ... + y = (1 + ... + y) - (1 + ... + (x-1))
= (y+1)*y/2 - (x-1)*x/2
此时枚举 x 的值,有
(y+1)*y/2 - (x-1)*x/2 = m
(y+1)*y - (x-1)*x = 2*m
(y+1)*y = 2*m+(x-1)*x
此时就有一种快速计算y的方法,先算出右边的值,再直接开根号得到一个小数,此时将这个小数变为整数,即有可能是 y 的值,之后计算验证即可。- #include <iostream>
- #include <cmath>
- using namespace std;
- int main()
- {
- long long m, x, y; cin >> m;
- for(x=0; x<m; ++x) {
- y = (long long)sqrt(2*m+(x-1)*x);
- if(y*(y+1) - x*(x-1) == 2*m && x < y) cout << x << " " << y << endl;
- }
- return 0;
- }
复制代码
ps: 我第一次试的时候没开 long long 就爆了 |
|