S=a + (a + 1) + (a + 2) + ...... + b(其中a, b > 0)

现在我们要求,给定一个正整数S,求有多少种不同的<a,b>,使得上述的等式成立。

这个问题很有意思,我猜大家一定想出了比较简单的那个方法了。

方法1:

代码大概是这个样子的:

int sum = 0;
for(int st = 1, ed = 1; ed < S/2;){
if(sum < S){
sum += ed;
ed++;
} else if(sum == S) {
printf("Find a solution: %d %d\n", st, ed);
sum += ed;
ed++;
} else {
sum -= st;
st++;
}
}

这段代码的意思就是利用两个游标进行不断的逼近,终会找到所有的答案。

虽然这种方法简单,但是如果我们手边恰好没有电脑,我们应该怎么算?我们如何用笔算出答案呢?试试S=100。

前天看具体数学,偶然找到了一个非常棒的方法,这个方法怎么就没想到呢?

方法2:

那个方法大概是这个样子:

S=a + (a + 1) + (a + 2) + ...... + b = 1/2 * (a+b)(b-a+1)

2S=(a+b)(b-a+1)=xy

令 x=a+b,y=b-a+1,求得 a=(x-y+1)/2, b = (x+y-1)/2。

因为a,b肯定都是整数,所以有如下结论:x,y奇偶性互反,也就是说,若x是奇数,则y为偶数,若x为偶数,y则为奇数,否则a,b将不会是整数(能想明白么?)。

那么得到了这些信息又有什么用呢?有用,好戏来了。

由上面的结论可知,每一个x,y(满足x,y奇偶性不同)都会得到一个(a,b)对,所以不同的a,b的数目与2S的因子数有关系。那么接下来我们就要找出所有满足条件的x,y。

这个问题又回到了一个老生常谈的整数的质因子分解问题上了。

详情可参考另一篇博客(开灯关灯问题),具体内容这里就不赘述了。下面直接来进行计算。

对2S进行质因数分解得:

2S=2^e[1]*p[2]^e[2]*......*p[m]^e[m]

那么,符合条件的x,y数目就是(e[2]+1)*(e[3]+1)*......*(e[m]+1),这里面没有用到e[1]是因为x,y其中一个是偶数,只要p[2]^e[2]*......*p[m]^e[m]的每个因子与2^e[1]相乘就会得到一个x,y。

接下来举个例子来说一下上面方法的过程吧!

S = 10
2S = 20 = (2^2)*5,所以满足S=a + (a + 1) + (a + 2) + ...... + b的a,b有两组。因为a,b都大于0,所以x>y。
1: x = 5,   y = 4 => a = 1   b = 4         即10=1+2+3+4
2: x = 20, y = 1 => a = 10  b= 10.       即10=10

S=15
2S=30=2*3*5,所以满足S=a + (a + 1) + (a + 2) + ...... + b的a,b有4组。
1: x=6,  y = 5 => a=1,b=5     即15=1+2+3+4+5
2: x=10,y = 3 => a=4,b=6     即15=4+5+6
3: x=15,y = 2 => a=7,b=8     即15=7+8
4: x=30,y = 1 => a=15,b=15  即15=15

到现在为止,我们都限定x>y,这是由a,b>0推出来的,x-y=(a+b)-(b-a+1)=2a-1>0 => x > y。

假如我们不限制a,b必须都取正数会是神马样子的结果呢?那么很容易,只要调换x,y就会得到不一样的答案。

再拿S=10为例:

1: x = 4, y = 5   => a=0,b=4     即10=0+1+2+3+4
2: x = 1, y = 20 => a=-9,b=10  即10=-9-8-7-......-1-0+1+2+3+......+9+10。

我想大家也看出规律来了,那么当S=15时,我们也很容易写出剩下的四种答案:
1: 15=0+1+2+3+4+5
2: 15=-1-2-3+0+1+2+3+4+5+6
3: 15=-6-5-4-3-2-1+0+1+2+3+4+5+6+7+8
4: 15=-14-13-......+0+1+2+......+14+15。

很简单的质因数分解能解决各种奇妙有趣的问题,真的很有意思。

你能不用计算机来计算S=a+(a+1)+(a+2) + ...... + b的解的数目吗?的更多相关文章

  1. 北京大学Cousera学习笔记--3-计算导论与C语言基础-第一讲.计算机的基本原理-计算机怎么计算-数的二进制

    思考问题 1.“数”在计算机中是如何表示的? 2.逻辑上“数”是怎么运算的? 3.物理上“数”的计算是怎么实现的? 从图灵机计算问题得出: 1.字母表中的符号越多(几进制),读入移动次数减少,但程序数 ...

  2. 技术派-不用sqrt手工计算平方根

    题目:任意长度数串,不使用sqrt函数,手工计算平方根?   要求只准用加/减/乘/除四则运算,不准使用power/sqrt等函数.   算法如下: 1.以小数点为中心往两边每2位分隔为一组: 2.然 ...

  3. Bank Robbery LightOJ - 1163(推方程 注意计算机的计算方式)

    题意:一个数A,如果A去掉它的最后一位就变成了B,即B=A/10,给A - B,求A #include <iostream> #include <cstdio> #includ ...

  4. Spark Mllib里相似度度量(基于余弦相似度计算不同用户之间相似性)(图文详解)

    不多说,直接上干货! 常见的推荐算法 1.基于关系规则的推荐 2.基于内容的推荐 3.人口统计式的推荐 4.协调过滤式的推荐 协调过滤算法,是一种基于群体用户或者物品的典型推荐算法,也是目前常用的推荐 ...

  5. 【计算机】CPU工作方式、多核心、超线程技术详解

    CPU架构要谈超线程和多核,就不得不谈CPU的架构和逻辑.无关的技术细节太多,这里略去.我们重点谈一下CPU中两个相关的模块:1)Processing Unit(运算处理单元),简称PU2)Archi ...

  6. IOS8 不用计算Cell高度的TableView实现方案

    这个新特性,意味着View被Autolayout调整frame后,会自动拉伸和收缩SupView. 具体到Cell,要求cell.contentView的四条边都与内部元素有约束关系. 在TableV ...

  7. 你不知道的关于计算机大师 Dijkstra 的事情

    Dijkstra 的全名叫 Edsger Wybe Dijkstra(艾兹赫尔·韦伯·戴克斯特拉).大部分中国程序员如果能记住这个名字是因为学过计算最短路径的「Dijkstra 算法」,然而大部分人都 ...

  8. Deferred Shading,延迟渲染(提高渲染效率,减少多余光照计算)【转】

    Deferred Shading,看过<Gems2> 的应该都了解了.最近很火的星际2就是使用了Deferred Shading. 原帖位置:   http://blog.csdn.net ...

  9. 为什么位运算可以实现加法(1、 不考虑进位的情况下位运算符中的异或^可以表示+号)(2、 位运算符中的与运算符&和左移运算符<<可以模拟加法中的进位)(3、位运算不仅可以做加法,还可以做其它的乘法减法等:计算机本质是二进制运算)

    为什么位运算可以实现加法(1. 不考虑进位的情况下位运算符中的异或^可以表示+号)(2. 位运算符中的与运算符&和左移运算符<<可以模拟加法中的进位)(3.位运算不仅可以做加法,还 ...

随机推荐

  1. Java 7 的7个新特性

    1.对集合类的语言支持:(??) 2.自动资源管理: 3.改进的通用实例创建类型推断:(??) 4.数字字面量下划线支持:(√) 5.switch中使用string:(√) 6.二进制字面量:(√) ...

  2. 在Java中>、>>、>>>三者的区别

    Java,是由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台的总称.用Java实现的HotJava浏览器(支持Java applet)显示了Java的魅力 ...

  3. Spring面试题集

    一.Spring简介       *  Spring框架有哪几部分组成? Spring框架有七个模块组成组成,这7个模块(或组件)均可以单独存在,也可以与其它一个或多个模块联合使用,主要功能表现如下: ...

  4. C#静态static的用法

    一.静态类 静态类与非静态类的重要区别在于静态类不能实例化,也就是说,不能使用 new 关键字创建静态类类型的变量.在声明一个类时使用static关键字,具有两个方面的意义:首先,它防止程序员写代码来 ...

  5. 《ASP.NET MVC4 WEB编程》学习笔记------HtmlHelper

    本文转载自powerzhang,如果给您带来不便请联系博主. 在实际的程序中,除了在View中展示数据外,还需要在View与后台的数据进行交互,在View中我就需要用的表单相关的元素: 在MVC3框架 ...

  6. ext上传文件到mysql上

    不废话,上代码: controller如下: /** * 上传附件 * @param request * @param baseBlob * @param response */ @RequestMa ...

  7. CodeForces - 404A(模拟题)

    Valera and X Time Limit: 1000MS   Memory Limit: 262144KB   64bit IO Format: %I64d & %I64u Submit ...

  8. Stanford大学机器学习公开课(六):朴素贝叶斯多项式模型、神经网络、SVM初步

    (一)朴素贝叶斯多项式事件模型 在上篇笔记中,那个最基本的NB模型被称为多元伯努利事件模型(Multivariate Bernoulli Event Model,以下简称 NB-MBEM).该模型有多 ...

  9. thinkphp实现导航高亮的简单方法

    经常会涉及到关于导航菜单高亮显示的问题,大多是通过配合js或者事先分配变量的方式来实现导航高亮的,这里提供另一种思路参考: <ul class="usermenu"> ...

  10. VS2010编写动态链接库DLL及单元测试用例,调用DLL测试正确性

    转自:http://blog.csdn.net/testcs_dn/article/details/27237509 本文将创建一个简单的动态链接库,并编写一个控制台应用程序使用该动态链接库,该动态链 ...