从12345这个数字中挑选出三个数共有十种方式:

\[123, 124, 125, 134, 135, 145, 234, 235, 245,345
\]

在组合学中,我们将其记为\(C(5,3)=10\)。一般地:

\[C(n,r)=\frac{n!}{r!(n-r)!},\ where\ r\le n
\]

其中\(n!=n\times(n-1)\times\cdots\times3\times2\times1\)且\(0!=1\)。我们可以发现,只到\(n=23\),才有一个组合数\(C(23,10)=1144066\)超过了一百万。那么,对于\(1\le n\le 100\)中有多少个\(C(n,r)\)大于一百万(可以重复计算)?

分析:我们在十五题中已经编写过计算组合数的函数,这里可以直接拿来用。当然,我们遍历一至一百,找到所有大于一百万的组合数,统计其个数即为题目所求,但还有一个效率更高的方法。我们知道对于特定的\(n\),\(C(n,r)\)先随着\(r\)的增加而增加,到达最大值后再随着\(r\)的增加而减少,且组合数具有对称性,即\(C(n,r)=C(n,n-r)\)。显然,如果\(C(n,r)\)大于一百万,那么从\(C(n,r)\)至\(C(n,n-r)\)中的所有数都会大于一百万,这样的数的个数\(k=(n-r)-r+1\),因此对于特定的\(n\),只要找到第一个大于一百万\(r\)的值,就不需要继续往后寻找,可以直接知道对于这个特定的\(n\),有多少个数会大于一百万。题目已经说明,在\(,n=23,r=10\)时会有第一个数大于一百万,则我们可以从23开始遍历,依次寻找每个\(n\)值下大于一百万的第一个\(r\)值,然后计算出在这个\(n\)下有多少数大于一百万,最后把所有的值加总,即为在\(1\le n\le100\)时组合数大于一百万的个数。代码如下:

# time cost = 997 µs ± 5.72 µs

from math import factorial as fac

def comb_num(n,k):
num = fac(n)/(fac(n-k)*fac(k))
return num def main():
count = 0
for n in range(23,101):
for r in range(1,n//2):
if comb_num(n,r) > 10**6:
count += (n - 2*r + 1)
break
return count

Project Euler 53: Combinatoric selections的更多相关文章

  1. (Problem 53)Combinatoric selections

    There are exactly ten ways of selecting three from five, 12345: 123, 124, 125, 134, 135, 145, 234, 2 ...

  2. Python练习题 049:Project Euler 022:姓名分值

    本题来自 Project Euler 第22题:https://projecteuler.net/problem=22 ''' Project Euler: Problem 22: Names sco ...

  3. Python练习题 039:Project Euler 011:网格中4个数字的最大乘积

    本题来自 Project Euler 第11题:https://projecteuler.net/problem=11 # Project Euler: Problem 10: Largest pro ...

  4. [project euler] program 4

    上一次接触 project euler 还是2011年的事情,做了前三道题,后来被第四题卡住了,前面几题的代码也没有保留下来. 今天试着暴力破解了一下,代码如下: (我大概是第 172,719 个解出 ...

  5. Python练习题 029:Project Euler 001:3和5的倍数

    开始做 Project Euler 的练习题.网站上总共有565题,真是个大题库啊! # Project Euler, Problem 1: Multiples of 3 and 5 # If we ...

  6. Project Euler 9

    题意:三个正整数a + b + c = 1000,a*a + b*b = c*c.求a*b*c. 解法:可以暴力枚举,但是也有数学方法. 首先,a,b,c中肯定有至少一个为偶数,否则和不可能为以上两个 ...

  7. Project Euler 44: Find the smallest pair of pentagonal numbers whose sum and difference is pentagonal.

    In Problem 42 we dealt with triangular problems, in Problem 44 of Project Euler we deal with pentago ...

  8. project euler 169

    project euler 169 题目链接:https://projecteuler.net/problem=169 参考题解:http://tieba.baidu.com/p/2738022069 ...

  9. 【Project Euler 8】Largest product in a series

    题目要求是: The four adjacent digits in the 1000-digit number that have the greatest product are 9 × 9 × ...

随机推荐

  1. 一文掌握在Word中快速编写公式

    在使用Word编写文章时,总会遇到书写数学公式的情况.使用Word的公式输入工具需要频繁地使用鼠标,因而编写公式会显得繁琐麻烦,那么有什么办法可以优雅地在Word中书写公式呢?其实Word早在Word ...

  2. 货物运输 51Nod - 1671

    公元2222年,l国发生了一场战争. 小Y负责领导工人运输物资. 其中有m种物资的运输方案,每种运输方案形如li,ri.表示存在一种货物从li运到ri. 这里有n个城市,第i个城市与第i+1个城市相连 ...

  3. bugku color

    下载打开压缩包是七张图片,分别是七个颜色,使用stegsolve打开发现了异常. 七张图片拼起来是 make me tall,看来是要修改图片高度. 我们使用winhex打开图片并在十六进制中修改图片 ...

  4. CentOS 7 的 systemctl 命令

    Centos 7.* 使用 Systemd 进行系统初始化,因此,Centos 7.* 中我们可以使用 systemctl 管理系统中的服务. systemctl 管理的服务均包含了一个以 .serv ...

  5. 秘制CSP模板

    不定期更细中...... 声明1:由于js的问题导致VIEW CODE按钮只能点"I"附近才能展开代码 声明2:为了排版的美观,所有的解释以及需要留意的地方我都放在代码中了 声明3 ...

  6. .Net Core API使用ODP.NET操作Oracle数据库

    .Net Core API使用ODP.NET操作Oracle数据库 1.下载Oracle.ManagerDataAccess.Core. 右键依赖项——管理NuGet程序包. 在浏览选项中查询Orac ...

  7. 物理机安装Kali Linux + Windows10双系统安装教程

    转自 https://www.linuxidc.com/Linux/2018-08/153429.htm 一.镜像下载: 根据需求下载自己需要的版本 从官网下载kali 2018.2 的安装包:htt ...

  8. 机器学习:eclipse中调用weka的Classifier分类器代码Demo

    weka中实现了很多机器学习算法,不管实验室研究或者公司研发,都会或多或少的要使用weka,我的理解是weka是在本地的SparkML,SparkML是分布式的大数据处理机器学习算法,数据量不是很大的 ...

  9. HTML 元素居中的方法

    网址:http://www.cnblogs.com/asqq/archive/2012/04/09/2438745.html 1. 元素的定位的方法选择 :absolute . 2. 给定元素的宽和高 ...

  10. opencv::Sobel算子

    卷积应用-图像边缘提取 卷积应用-图像边缘提取 边缘是什么 – 是像素值发生跃迁的地方,是图像的显著特征之一, 在图像特征提取.对象检测.模式识别等方面都有重要的作用. 如何捕捉/提取边缘 – 对图像 ...