连续整数的和(51Nod-1138)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011815404/article/details/89378473

题目

给出一个正整数N,将N写为若干个连续数字和的形式(长度 >= 2)。例如N = 15,可以写为1 + 2 + 3 + 4 + 5,也可以写为4 + 5 + 6,或7 + 8。如果不能写为若干个连续整数的和,则输出No Solution。

输入

输入1个数N(3 <= N <= 10^9)。

输出

输出连续整数中的第1个数,如果有多个按照递增序排列,如果不能分解为若干个连续整数的和,则输出No Solution。

输入样例

15

输出样例

1
4
7

思路:

设若干连续数字和的首项为 a,则有:a+(a+1)+(a+2)+...+(a+k)=n,共有 k 项

即:ka+\frac{(k-1)k}{2}=n

化简有:a=\frac{n-\frac{k(k-1)}{2} }{k}

由于 a 最小为 1,那么当 a=1 时有:n=k+\frac{k(k-1)}{2}=\frac{k(k+1)}{2}

因此,k_{max}=\sqrt{2n}

故而从 \sqrt{2n} 开始枚举到 3,当 i 满足 (n-\frac{i*(i-1)}{2}) \: mod \:n=0 时,输出 \frac{(n-\frac{i*(i-1)}{2}) } {i} 即可

源程序

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cmath>
#include<ctime>
#include<algorithm>
#include<utility>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<map>
#define EPS 1e-9
#define PI acos(-1.0)
#define INF 0x3f3f3f3f
#define LL long long
const int MOD = 1E9+7;
const int N = 50000+5;
const int dx[] = {-1,1,0,0};
const int dy[] = {0,0,-1,1};
using namespace std;


int main() {
    int n;
    scanf("%d",&n);

    int flag=false;
    for(int i=sqrt(2.0*n);i>=2;i--){
        if((n-i*(i-1)/2)%i==0){
            printf("%d\n",(n-i*(i-1)/2)/i);
            flag=true;
        }
    }
    if(!flag)
        printf("No Solution\n");

    return 0;
}

猜你喜欢

转载自blog.csdn.net/u011815404/article/details/89378473