由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.也就是说,如果我们从头到尾依 ...
随机推荐
- Binary Tree Maximum Path Sum leetcode java
题目: Given a binary tree, find the maximum path sum. The path may start and end at any node in the tr ...
- C#利用tabControl控件实现多窗体嵌入及关闭
创建一个主窗体(Formmain).两个副窗体(Form1,Form2);在主窗体中分别添加一个menuStrip控件.tabControl控件,并在menu控件上添加一个主菜单和两个子菜单 继而 ...
- Oracle中rownum用法警示
今天调试代码,发现分页查询时使用Oracle中rownum的between......and用法的bug,特此总结: 参考资料:http://blog.csdn.net/lg312200538/art ...
- HMM与分词、词性标注、命名实体识别
http://www.hankcs.com/nlp/hmm-and-segmentation-tagging-named-entity-recognition.html HMM(隐马尔可夫模型)是用来 ...
- nodejs pipe实现大文件拷贝
原文: http://nqdeng.github.io/7-days-nodejs/ --------------------------------------------------------- ...
- capwap学习笔记——初识capwap(三)
2.5.6 CAPWAP状态机详解 2.5.6.1 Start to Idle 这个状态变迁发生在设备初始化完成. ¢ WTP: 开启CAPWAP状态机. ¢ AC: 开启CAPWAP状 ...
- Eclipse QuickSear的插件的说明
https://spring.io/blog/2013/07/11/eclipse-quick-search Eclipse QuickSear的插件的说明
- mac sierra 10.12部分注册机Special-K+CORE Keygen不能运行的问题
自从mac升级到了sierra之后,很多注册机都打不开了,于是,我想尽了很多办法之后,终于搞定. 1.国外的大神,开发了一个软件,可以修复你的破解补丁,操作方法如下: 下载软件 http://bbs. ...
- 火星坐标、百度坐标、WGS84坐标转换代码(JS、python版)
火星坐标.百度坐标.WGS84坐标转换代码(JS.python版) 一.JS版本源码 github:https://github.com/wandergis/coordTransform /** * ...
- 微服务架构实践 - 你只懂docker与spring boot就够了吗?
微服务架构实践 - 你只懂docker与spring boot就够了吗? 作者 浮云发发 已关注 2017.02.27 02:50* 字数 2613 阅读 2583评论 6喜欢 35赞赏 2 微服务并 ...