刚开始用的是枚举,结果不出意外的超时了,分析了一下,这题主要考察等差数列的运用,看来数学学得扎实,程序才能简洁,才能高效,重视先数学思维,再程序实现,数学好,才是真的好。
等差数列求和公式:
Sn=(a1+aN)*n/2
=(a1+a1+d(n-1))*n/2
=a1*n+d(n-1)*n/2;
若想使N项的和等于M,先看看N的最大值为多少,然后再逐级递减至1,这一步很关键,可以节省很多时间,
N(max) = sqrt( 2 * M ) ;
a1*n = M - (n - 1)*n / 2 ;
如果 ( M - (n - 1)*n / 2 ) % n == 0 ,则a1为首项 ;
#include<stdio.h>
#include<cmath>
int main() {
int N , M ;
while(scanf("%d%d",&N,&M) != EOF) {
if(N==0&&M==0)
return 0 ;
int len = (int)sqrt(M*2.0);
int a1_len = 0 ;
for(;len > 0 ; len--) {
a1_len = M - len * (len-1) / 2 ;
if(a1_len%len == 0) {
printf("[%d,%d]\n",a1_len/len,a1_len/len + len - 1);
}
}
printf("\n");
}
return 0 ;
}