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


    解题关键:注意为什么上界是$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
    ";
    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个自然数之和。

  • 相关阅读:
    jQuery使用手册
    数据结构排序算法总结(转)
    VS2008升级激活码
    用VS2005建立解决方案
    backgroundposition 用法详细介绍
    CSS布局口诀,学ccs不再难
    Web.Config文件中SQLServerExpress数据库连接配置解释(转)
    css
    2011,我来了!
    Ajax验证用户名是否存在
  • 原文地址:https://www.cnblogs.com/elpsycongroo/p/6918193.html
Copyright © 2020-2023  润新知