1. 程式人生 > >HDU 2058 The sum problem 題解

HDU 2058 The sum problem 題解

由題意得:

1.輸入第一個數“n”,作為首項與公差都為“1”的末項

2.輸入第二個數“m”,輸出序列和為“m”的所有子序列,既找到首項“a1”與項數"len"

3.由等差數列求和公式 S=n*(a1+an)/2=a1*n+n*(n-1)*d/2 得:a1*len=m-len*(len+1)/2   所以m-len*(len+1)/2與len存在倍數關係

4.m=((x+1)+(x+2)+(x+3)+……+(x+len))=(x+1+x+len)*len/2=m   所以當“x”取最小值“0”時,len最大  (1+len)*len/2=m  所以len<sqrt(2*m)

5.程式碼如下:

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int main()
{
    int n,m;
    while(cin>>n>>m,n||m)
    {
        int len=(int)(sqrt(m*2));
        for(int i=len;i>=1;i--)
        {
            int t=m-i*(i+1)/2;
            if(t%i==0)
                printf("[%d,%d]\n",t/i+1,t/i+i);
        }
        cout<<endl;
    }
    return 0;
}