由m种数字组成的n位数有多少个
问题描述
我和我女朋友的QQ号都是九位数字,这九个数字是有七个不同的数字组成的,我想问这种概率是多大,我们是不是特别我看缘分呢?求大神给算一下概率!
思路
定义问题:由7种数字组成的9位数一共有多少个?记做x,则答案为$\frac{x2}{C_{10}7 \times C_{10}^{18}}$
所以关键在于由7种数字组成的9位数一共有多少个
from collections import Counter
from scipy.special import comb as c, factorial as f
"""
我和我女朋友的QQ号都是九位数字,而这九个数字完全相同只是数字顺序不同,这九个数字是有七个不同的数字组成的,我想问这种概率是多大
"""
def split(n, m):
"""
整数拆分,把整数n拆成m个整数之和的形式
:param n:
:param m:
:return:
"""
if m == 0: return
a = [1] * m
a[-1] = n - (m - 1)
yield a
def can_increase(i):
# i是否有增长空间
if i == m - 1: return False
for j in range(i + 1, m):
if a[j] - a[i] > 1:
return True
return False
while 1:
# 首先找到最后一个增长点
i = m - 1
while i >= 0 and not can_increase(i):
i -= 1
# 如果没有增长点,直接退出
if i == -1:
break
# 增长点增长,并且更改后续数组
a[i] += 1
for j in range(i + 1, m):
a[j] = a[i]
a[-1] = n - sum(a[:-1])
yield a
def g(n, m):
"""
由m个正整数组成的n位数有多少个
:param n:
:param m:
:return:
"""
s = 0
for i in split(n, m):
number_left = m
position_left = n
now = c(10, m)
for j in i:
now *= number_left * c(position_left, j)
position_left -= j
number_left -= 1
for j in Counter(i).values():
now /= f(j)
s += now
return s
def test():
for i in range(1, 15):
s = 0
for j in range(i + 1):
s += g(i, j)
if s != 10 ** i:
raise Exception("error {} {} {}".format(i, s, 10 ** i))
def find_rule():
ma = 30
table = [[0] * ma for _ in range(ma)]
for i in range(1, ma):
for j in range(1, i + 1):
table[i][j] = g(i, j)
for i in range(1, ma):
for j in range(1, i + 1):
print("%-8d" % (table[i][j] / table[i - 1][j]) if i > 1 and table[i - 1][j] else table[i][j], end=' ')
print()
for i in range(1, ma):
for j in range(1, i + 1):
print("%-8d" % table[i][j], end=' ')
print()
test()
print(g(9, 7) ** 2 / c(10, 7) / 10 ** 18)
find_rule()
上述程序求解复杂度较高,实际上可以找到规律。用找到的规律可以飞快解决:由m种数字组成的n位数一共有多少种这种问题。
我找到的规律如下:
1、对于10进制来说,由11种数字组成的n位数个数为0,因为总共就10种数字,也就是说,整个表格只有前10列不为零
2、对于每列来说,最终都会变成等比数列,第i列的公比就是i
3、从左上角到右下角的斜线,呈现9、8、7、6、5、4、3、2、1、0的比例
由m种数字组成的n位数有多少个的更多相关文章
- CF D - Beautiful Graph(dfs 染色问题吧)给你一个图,每个节点可以赋值1,2,3三种数字,相邻的节点的和必须是奇数,问有多少中方法。
题意: 给你一个图,每个节点可以赋值1,2,3三种数字,相邻的节点的和必须是奇数,问有多少中方法. 分析: 很容易就可以发现如果这个图中是有奇数的环的话,那这是肯定不行的 ,否则这个环的贡献是为2^s ...
- 页面加载后累加,自加1&&判断数字是否为两位数
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 第2章-7 产生每位数字相同的n位数 (30分)
第2章-7 产生每位数字相同的n位数 (30分) 读入2个正整数A和B,1<=A<=9, 1<=B<=10,产生数字AA-A,一共B个A 输入格式: 在一行中输入A和B. 输出 ...
- delphi Edit 控制最大值,只能输入数字型 控制小数位数
delphi语言受众多程序员追捧,主要原因之一就是它有很多第三方的控件可供使用.很多资深的delphi程序员都把自己积累的函数.过程等设计成控件,以方便使用,提高开发效率. 本文通过一个只允许输入数字 ...
- Linux下科学计数法(e)转化为数字的方法 [shell中几种数字计算说明]
科学计数法使用e标识数值,将科学计算学转化为数字的思路:按e右边的数字移动小数点位数.e右边的数字如果是负数,则向左移动小数点.示例如下: 1.2345678e2 = 123.45678 1.2345 ...
- [CareerCup] 5.5 Number of Converted Bits 转换数字所需的位数
5.5 Write a function to determine the number of bits required to convert integer A to integer B.EXAM ...
- thinkjs——一个字段一种数字代表两种状态
问题来源: 现有一张company数据表,其中有一个字段state(-2:待审核:-1:禁用:0:正常:1:会员过期:),一般而言,在前期设计数据表的时候,会将每种状态下都用一种特定的数字代表,但是这 ...
- PHP 数字补零 固定位数补0
在处理订单编号的时候,需要固定位数的数字,比如需要固定四位数格式: 1->0001 56->0056 288->0288 1992->1992 可以使用php内置函数str_p ...
- 剑指offer——62数组种数字出现的次数
题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 题解: 我们想到异或运算的一个性质:任何一个数字异或它自己都等于0.也就是说,如果我们从头到尾依 ...
随机推荐
- jQuery中的编程范式
浏览器前端编程的面貌自2005年以来已经发生了深刻的变化,这并不简单的意味着出现了大量功能丰富的基础库,使得我们可以更加方便的编写业务代码,更重要的是我们看待前端技术的观念发生了重大转变,明确意识到了 ...
- 初学 Delphi 嵌入汇编[1] - 汇编语言与机器语言
非科班出身, 现在才接触汇编, 惭愧呀, 好好学! 主选课本是清华大学王爽老师的<汇编语言>. 推荐 王爽老师的汇编网 汇编语言之前是机器语言. 机器语言是机器指令的集合, 机器指令是一系 ...
- python os.path模块常用方法详解 ZZ
os.path模块主要用于文件的属性获取,在编程中经常用到,以下是该模块的几种常用方法.更多的方法可以去查看官方文档:http://docs.python.org/library/os.path.ht ...
- Java面试问题总结
前几天Java面试中遇到的问题,这仅仅是当中的一部分问题.面试中有非常多问题是关于数据结构和算法的.在这里做下总结,希望有能力的人能够试着做一下,并在评论区留下您的答案.让大家相互学习.谢谢 程序设计 ...
- Axure-如何设置圆形组件
--打开Axure软件,在[选择部件库]窗口中找到如图中所示的矩形. --将矩形拖到设计布局中 --将鼠标悬停在矩形上就能看到右上角有一个小圆点 --点击小圆点就能选择不同的形状,如:圆形
- (纪录片)科学的故事:权力、证据与激情 The Story Of Science: Power, Proof And Passion
简介: 导演: 纳特·沙曼编剧: 纳特·沙曼主演: Michael J. Mosley类型: 纪录片官方网站: www.bbc.co.uk/programmes/b00s9mms制片国家/地区: 英国 ...
- .NET 服务器定位模式(Service Locator Pattern)——Common Service Locator
本文内容 场景 目标 解决方案 实现细节 思考 相关模式 更多信息 参考资料 Common Service Locator 代码很简单,它一般不会单独使用,而是作为一个单件模式,与像 .net Uni ...
- setUserVisibleHint-- fragment真正的onResume和onPause方法
现在越来越多的应用会使用viewpager+fragment显示自己的内容页,fragment和activity有很多共同点,如下图就是fragment的生命周期 但是fragment和activit ...
- Word模板中的表格处理
在软件系统中,我们经常要输出一些word ,excel,ppt文档,为了输出结果漂亮美观.输出操作方便快捷,通常要制作一些模板文件,通过对模板文件中的关键信息进行修改,就不用管排版.格式等处理了. 在 ...
- ubuntu iptables设置【转】
root@qustdjx-K42JZ:/home/qustdjx# iptables -L -nChain INPUT (policy ACCEPT)target prot opt sourc ...