[算法题讨论]超大组合数的求解

题目说明

题目来源是一场笔试,第一次笔试慌慌张张,考场中并没有做出来。以上不表。
直接看题:两个人小王和小李玩石头剪刀布的游戏。一共玩n次。小王赢一次的一份,输了不扣分。如果小王得到s分,且已知小李出拳顺序,求小王可能的出拳组合总数。

输入:游戏场数n,小王游戏得分s,小李的出拳顺序数组p
在数组p中,0代表石头,1代表布,2代表剪刀。
输入样例:
3 2
0 1 2

输出:可能组合的数目对1e9+7取模
输出样例:6

题目分析

其实就是求小王在n场游戏中获证s场的组合数。按照排列组合的思想,就是从n局游戏中,选出s场来胜利得分(针对一种出拳方式,胜利的方式只有1种),剩下的n-s场不能得分,也就是不能胜利。Note:不能胜利就有两种可能,可以是平局,也可以是输。这两种都是不得分的。

设C(m)(n)表示从m个候选中挑出n个的组合数,即等于
m*(m-1)*(m-2)*...*(m-n+1) / n*(n-1)*(n-2)*...*2*1

那么从n场游戏中挑s场得分,剩余n-s场不得分的组合数就是
C(n)(s)*2^(n-s)

简单说一下原因:前面C(n)(s)表示选哪些场得分哪些场不得分的种数,即一共有C(n)(s)种方法确定得分s场。例如C(3)(2)表示3场游戏有2场胜利,共有C(3)(2)种方式选择哪两场胜利;选定哪些场次胜利哪些场次不胜利之后,还要注意不胜利的场次有两种出拳方式,那不胜利的场次有(n-s)场,所有不胜利场次出拳则共有2^(n-s)种可能。二者相乘就是总的可能的组合数,即C(n)(s)*2^(n-s)

不知道有没有叙述清楚,如果以上看不懂,得复习一下本科概率论中关于排列组合的东西了,或者直接看高中课本的排列组合。

本题的重点不在于推出这个组合数,在于n和s的取值范围都是[1,2000],如果按照常规方法,2000的阶乘即2000!肯定是要超过内存可以存储的范围。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值