从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. javascript DOM节点

    获得子节点方式: 1.将文本内容也当成节点 childNodes firstChild lastChild 2.获得标签为内容的节点 children firstElementChild lastEl ...

  2. python编程基础之十七

    字符串:str1 = '123' str2 ="123" str3 = """123""" str4 = '''123' ...

  3. 无人机基于Matlab/Simulink的模型开发(连载一)

    "一切可以被控制的对象,都需要被数学量化" 这是笔者从事多年研发工作得出的道理,无论是车辆控制,机器人控制,飞机控制,还是无人机控制,所有和机械运动相关的控制,如果不能被很好的数学 ...

  4. bugku web8

    打开网站,是一段PHP代码, <?php extract($_GET); if (!empty($ac)) { $f = trim(file_get_contents($fn)); if ($a ...

  5. Python接口测试框架实战与自动化进阶☝☝☝

    Python接口测试框架实战与自动化进阶☝☝☝  一.fiddler在工作中的运用  1.如何抓接口 抓紧手机端接口 ①.在电脑终端输入:ipconfig ,找到电脑ip ②.打开手机,连接WiFi, ...

  6. 2019滴滴php面试总结 (包含面试题解析)

    2019滴滴java面试总结  (包含面试题) 本人6年开发经验.今年年初找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.滴滴等公司offer,岗位是既有php也有Java后端开发,最终选择去了滴滴 ...

  7. Java中获取刚插入数据库中的数据Id(主键,自动增长)

    public int insert(String cName, String ebrand, String cGender) { String sql = "insert into Clot ...

  8. [Mathematics][MIT 18.02]Detailed discussions about 2-D and 3-D integral and their connections

    Since it is just a sort of discussion, I will just give the formula and condition without proving th ...

  9. 帝国cms网站管理系统之安全设置最优化分享

    首先我们来认识一下帝国CMS安全认证特性:帝国登录四重安全验证:第一重:密码双重MD5加密,密码不可破解,假如数据库被下载,也无法获取真实密码.第二重:后台目录自定义,假如对方知道密码也找不到登录后台 ...

  10. 《深入理解Java虚拟机》-----第13章 线程安全与锁优化

    概述 在软件业发展的初期,程序编写都是以算法为核心的,程序员会把数据和过程分别作为独立的部分来考虑,数据代表问题空间中的客体,程序代码则用于处理这些数据,这种思维方式直接站在计算机的角度去抽象问题和解 ...