51Nod-1138-连续整数的和

来源:互联网 发布:编程游戏 编辑:程序博客网 时间:2024/05/29 04:48

ACM模版

描述

描述

题解

利用等差数列公式推导即可,设首项为i,项数为j,则可得到(2N-j*j+j)/(2*j)=i
这里枚举项数j即可,因为项数j最多可以为sqrt(2N),故A之……
另外强调的是,注意输出的格式,因为我一开始输出的是i没有格式化,所以WA了一半数据。

代码

#include <iostream>#include <cmath>typedef long long ll;using namespace std;int main(int argc, const char * argv[]){    int N;    while (cin >> N)    {        bool flag = true;        //  设首项为i,项数为j,则(2*i+j-1)*j/2=n        //  (2*i+j-1)*j=2n        //  (2n-j*j+j)/(2*j)=i        ll N_ = 2 * N;        int MAX_J = (int)sqrt(N_);        for (int j = MAX_J; j >= 2; j--)        {            double i = (N_ - j * j + j) * 1.0 / (2 * j);            if (i == (int)i)            {                flag = false;                printf("%d\n", (int)i);            }        }        if (flag)        {            cout << "No Solution\n";        }    }    return 0;}
0 0
原创粉丝点击