#include <math.h>
#include <stdio.h>
int main()
{
long long int n,m;
while(scanf("%lld %lld",&n,&m)&&(n!=0||m!=0))
{
long long int d=(sqrt(1+8*m)-1)/2;
while(d)
{
long double a;
a=((2.0*m/d)+1-d)/2;
if(a==(long long int)a)
{
printf("[%lld,%lld]\n",(long long int)a,(long long int)a+d-1);
}
d--;
}
printf("\n");
}
}
已AC
这题不能暴力啊。。。
先是求出最长的长度 当i=1时一直开始加 用等差数列的方程可以求解出最长的长度d(不用管他能不能整除,一定是最长的),嗯 然后就用最大的长度d一直往下递减,因为都是整数 用等差数列的表达式可以求出首项a和长度d的关系 然后因为a必然是整数 利用这个条件可以得出所有的区间 这样下来时间复杂度低了好多