题目
题解思路
可以很明显看出这是个等差数列,我们有对应的求和公式可以用,但是公式里面包含了首项和长度N,如果直接枚举N必然超时。这是就有个巧妙的不等式限制了N的范围,
因为首项为1,所以Sn=n+(n-1)n/2=(n+1)n/2,令M=Sn,N为项的个数,则N<=n(max)=sqrt(Sn2)=sqrt(M*2); 这里的n+1忽略是因为int相除会损失精度的就使得不等式完全成立!妙啊
当N被确定时,用公式a1*N=Sn-(N-1)N/2求出后判断a1是否是个整数即可!
此题不太容易理解,手模试试!
AC代码
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
int main()
{
long long n,m;
while(scanf("%lld%lld",&n,&m))
{
if(n==0&&m==0)
break;
for(long long i=sqrt(2*m);i>0;i--)
{
long long b;
b=m-i*(i-1)/2;
if(b%i==0)
{
printf("[%lld,%lld]\n",b/i,b/i+i-1);
}
}
printf("\n");
}
return 0;
}