正常直观的循环会超时,先设i为起始值,j为区域内数的个数,因为m=(i+i+j-1)*j/2,所以j<sqrt(2*m),然后就可以仅循环j,通过m=(i+i+j-1)*j/2而确定i(int型)的值,然后判断此i的值是否满足m=(i+i+j-1)*j/2即可。因为是从小到大输出的,j的值就是从大到小排列才可以。
#include<iostream>
#include<math.h>using namespace std;
int main()
{
int n,m;
while(cin>>n>>m&&n!=0&&m!=0)
{
int j;
for(j=(int)sqrt(2.0*m);j>=1;j--)
{
int i;
i=(2*m/j+1-j)/2;
if((2*i+j-1)*j/2==m)
cout<<'['<<i<<','<<i+j-1<<']'<<endl;
}
cout<<endl;
}
}