题目说明
题目来源是一场笔试,第一次笔试慌慌张张,考场中并没有做出来。以上不表。
直接看题:两个人小王和小李玩石头剪刀布的游戏。一共玩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!
肯定是要超过内存可以存储的范围。