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

猜你喜欢

转载自blog.csdn.net/aptx4869971/article/details/82728554