zoukankan      html  css  js  c++  java
  • [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个自然数之和。

  • 相关阅读:
    centos7.6 安装与配置 MongoDB yum方式
    MongoDB 介绍
    centos 关闭selinux
    前端 HTML标签属性
    前端 HTML 标签嵌套规则
    前端 HTML 标签分类
    前端 HTML body标签相关内容 常用标签 表单标签 form里面的 input标签介绍
    前端 HTML body标签相关内容 常用标签 表单标签 form 表单控件分类
    前端 HTML form表单标签 select标签 option 下拉框
    POJ 1426
  • 原文地址:https://www.cnblogs.com/elpsycongroo/p/6918193.html
Copyright © 2011-2022 走看看