HDU2058

作者: 费曼JW | 来源:发表于2019-07-15 23:00 被阅读0次

    题目链接: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<iostream>
    #include<cmath>
    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

          本文链接:https://www.haomeiwen.com/subject/hscakctx.html