HDU2058

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2058

HDU2058

思路:
一开始直接枚举子序列求解,直接超时。
改变思路:等差数列求和问题 Sn=n(a1+an)/2=n*a1+n(n-1)d/2
题目中的子序列可看成 (a+1)+(a+2)+(a+3)+...+(a+n),提出 a 则为首项为1 公差为1 共n项的等差数列,则 m=a*n + n*(1+n)/2 可得出 a<(2*m)^1/2,枚举a,即可解出n。

代码:

#include
#include
using namespace std;
int main(void)
{
    int n,m;
    while (cin >> n >> m && (n||m))
    {
        for (int i = sqrt(m * 2); i > 0; i--)
        {
            int an = m - (i*(1+i)) / 2;
            if (an%i == 0)
                cout << '[' << (an / i) + 1 << ',' << (an / i) + i << ']' << endl;
        }
        cout << endl;
    }
    return 0;
}

你可能感兴趣的:(HDU2058)