码迷,mamicode.com
首页 > 其他好文 > 详细

[51nod1138]正整数分解为几个连续自然数之和

时间:2017-05-29 16:33:05      阅读:113      评论:0      收藏:0      [点我收藏+]

标签:--   code   its   不等式   是什么   正整数   分解   ++   51nod   

解题关键:注意为什么上界是$\sqrt {2n} $

因为函数是关于m的递减函数,而结果必须为正整数

$a = \frac{{2n + m - {m^2}}}{{2m}} = \frac{n}{m} + \frac{1}{2} - \frac{m}{2}$

将$\sqrt {2n} $带入,结果为$\frac{1}{2}$,正好保证了结果不为负,因为函数是单调递减的,所以也不需判断结果是否为负。

 

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 int main(){
 5     int n;
 6     cin>>n;
 7     bool flag=false;
 8     int t=sqrt(2*n);
 9     for(int i=t;i>=2;i--){
10         int t1=2*n+i-i*i;
11         int t2=2*i;
12         if(t1%t2==0){
13             flag=true;
14             cout<<t1/t2<<endl;
15         }
16     }
17     if(!flag) cout<<"No Solution\n";
18     return 0;
19 }

 

第二个问题是什么样的数可以写成连续n个自然数之和,什么样的数不能?
通过编程实验发现,除了2^n以外,其余所有数都可以写成该形式。下面说明为什么。
若数M符合条件,则有M=a+(a+1)+(a+2)+…+(a+n-1)=(2*a+n-1)*n/2,而2*a+n-1与n肯定一个为奇数一个为偶数,即M一定要有一个奇数因子,而所有2^n都没有奇数因子,因此肯定不符合条件。
再证明只有M有一个奇数因子,即M!=2^n,M就可以写成连续n个自然数之和。假设M有一个奇数因子a,则M=a*b。
1)若b也是奇数,只要b-(a-1)/2>0,M就可以写成以b-(a-1)/2开头的连续a个自然数;将这条结论里的a和b调换,仍然成立。15=3*5=1+2+3+4+5=4+5+6.
2)若b是偶数,则我们有一个奇数a和一个偶数b。
2.1)若b-(a-1)/2>0,M就可以写成以b-(a-1)/2开头的连续a个自然数。24=3*8=7+8+9.
2.2)若(a+1)/2-b>0,M就可以写成以(a+1)/2-b开头的连续2*b个自然数。38=19*2=8+9+10+11.
上述两个不等式必然至少有一个成立,所以可以证明,只要M有一个奇数因子,就一定可以写成连续n个自然数之和。

[51nod1138]正整数分解为几个连续自然数之和

标签:--   code   its   不等式   是什么   正整数   分解   ++   51nod   

原文地址:http://www.cnblogs.com/elpsycongroo/p/6918193.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!