洛谷 P1147 连续自然数和

守給你的承諾、 提交于 2020-01-24 03:54:47

P1147 连续自然数和

思路:

设一段自然数的首项为a1,末项为a2,则这段自然数之和为:
sum =(a1 + a2) * (a2 - a1 + 1) / 2 = m
即(a1 + a2) * (a2 - a1 + 1) = 2m
可以把2M分解成两个数之积,假设分成了两个数K1,K2,且K1<K2时,
可以列一个二元一次方程组:
(1)a2 - a1 + 1 = K1
(2)a1 + a2 = K2

解得:a1 = ( K2 - K1 + 1 ) / 2 , a2 = ( K1 + K2 - 1 ) / 2
要保证a1和a2都为自然数,K2和K1必须是一个奇数,一个偶数
不过有一种特殊情况,就是a1 = a2的情况,这种情况是不允许的
即(K2-K1+1)/2 ≠ (K1+K2-1)/2,解得K1≠1

代码如下:

#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<cmath>
typedef long long ll;
using namespace std;

int m,k1,k2;

int main(){
    scanf("%d",&m);
    for(k1=sqrt(2*m);k1>1;k1--){
        if(2*m%k1==0&&(k1+2*m/k1)%2==1){//如果k2为整数且k1,k2一奇一偶
                                        //奇数+偶数的和必定是奇数
            k2=2*m/k1;
            int a1=(k2-k1+1)/2,a2=(k1+k2-1)/2;
            printf("%d %d\n",a1,a2);
        }
    }
    return 0;
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!