这道题如果用枚举法肯定会超时,所以用等差数列求和公式才行。
如下图:

注意函数sqrt( ) 的参数只能是float ,double,long double型的,所以在里面要要把2*m 强制转换成double
型的。
如下图:

代码如下:
#include<iostream>
#include<cmath>
using namespace std;
int main(){
int n,m,a,t;
while(scanf("%d%d",&n,&m),n||m){
for(t=(int)sqrt((double)2*m);t>=1;t--){
a=m/t-(t-1)/2;
if(t*(2*a+t-1)==2*m)
printf("[%d,%d]\n",a,a+t-1);
}
printf("\n");
}
return 0;
}
本文介绍了一种通过等差数列求和公式而非枚举法来解决特定数学问题的方法,避免了超时错误,提高了算法效率。
386

被折叠的 条评论
为什么被折叠?



