HDU(2058)条件限制

来源:互联网 发布:大数据概念股龙头 编辑:程序博客网 时间:2024/04/28 22:20

刚开始用的是枚举,结果不出意外的超时了,分析了一下,这题主要考察等差数列的运用,看来数学学得扎实,程序才能简洁,才能高效,重视先数学思维,再程序实现,数学好,才是真的好。

等差数列求和公式:

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 ;}

0 0
原创粉丝点击