题目
有2k只球队,有k-1个强队,其余都是弱队,随机把它们分成k组比赛,每组两个队,问两强相遇的概率是多大?
给定一个数k,请返回一个数组,其中有两个元素,分别为最终结果的分子和分母,请化成最简分数
测试样例:
4
返回:[3,7]
思路
总共的组合数为 num1=(2k−1)∗(2k−3)∗...∗1num1=(2k−1)∗(2k−3)∗...∗1
强队和弱队组合数为 num2=C2k+1∗Ak+1k+1num2=Ck+12∗Ak+1k+1
两强相遇的概率为num2−num1num1num2−num1num1
代码
class Championship:
def get_C(self, n, m):
count = 1
num1 = 1; num2 = 1;
while count <= m:
num1 *= n
n -= 1
num2 *= count
count += 1
return num1 // num2
def get_A(self, n, m):
count = 1
num = 1
while count <= m:
num *= n
n -= 1
count += 1
return num
def gcd(self, x, y):
while y:
tmp = y
y = x % y
x = tmp
return x
def calc(self, k):
# write code here
if k == 2:
return [0, 1]
num1 = 1
count = 1
while count <= 2 * k - 1:
num1 *= count
count += 2
num2 = num1 - self.get_C(k + 1, 2) * self.get_A(k - 1, k - 1)
gcd = self.gcd(num1, num2)
return [num2 // gcd, num1 // gcd]