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个自然数之和。

  • 相关阅读:
    拾遗:『rhel6系列的开、关机脚本』
    拾遗:{rpm、yum及源码方式管理软件包}
    拾遗:sed&vim
    拾遗:Linux 用户及权限管理基础
    『BASH』——Learn BashScript from Daniel Robbins——[003]
    『BASH』——Hadex's brief analysis of "Lookahead and Lookbehind Zero-Length Assertions"
    『BASH』——Learn BashScript from Daniel Robbins——[001-002]
    Modular arithmetic and Montgomery form 实现快速模乘
    __int128使用
    Windows10下安装CentOS7双系统
  • 原文地址:https://www.cnblogs.com/elpsycongroo/p/6918193.html
Copyright © 2011-2022 走看看