【转】HDU-2058-The sum problem

思路

首先 有 等差数列求和公式 : S=(a1+an)*n/2;

进一步化简成只包含 a1 和 项数n : S=a1*n + (n-1)*n/2;(本题 等差 d=1)

此时 题中给了S 即 M, 求 区间[a1,an], 这样问题就归结到 确定n 在范围内 搜索 满足上述公式 a1的值 即可得出答案

而n的最大值 可以通过公式M=[ a1+a1+(n-1)*d ]*n/2(其中a1=1,d=1, M已知)  即n=sqrt(2*M);

从而 利用n控制循环对于指定的M 寻找满足条件 a1*n=M-(n-1)*n/2的a1, 直到n=1 也就是区间[M,M] 

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;

int main()
{
        int N, M;
        while(cin>>N>>M && N||M)
        {
                int n=sqrt(2*M);
                while(n)
                {
                        int A1N=M-(n-1)*n/2;// a1*n=S-(n-1)*n/2 
                        if(A1N%n==0)
                            cout<<"["<<A1N/n<<","<<A1N/n+n-1<<"]"<<endl;
                        n--;
                }
                cout<<endl;
        }
        return 0;
}

后记:

代码参考别人的 可以AC

但对于 数据20 30 就不符合题目要求了

 

posted @ 2015-08-22 11:26  _SunDaSheng  阅读(139)  评论(0编辑  收藏  举报