问题描述
现有nnn个人,从中选择任意数量的人组成一支队伍,再从这些人中选出1名队长,求不同方案数对∣109+7∣|10^9 + 7|∣109+7∣ 的结果。如果两个方案选取的人的集合不同或选出的队长不同,则认为这两个方案是不同的。求输入任意人数nnn得到的队伍数。
问题分析
典型的排列组合问题。因为从nnn个人中选择任意数量的人组成队伍,则依次有Cn1,Cn1,…,CnnC_n^1, C_n^1, \dots, C_n^nCn1,Cn1,…,Cnn中选择方式。然后,在这些队伍中选择一个人作为队长,即可解决问题。
具体地,f(n)=Cn1⋅1+Cn2⋅2+⋯+Cnn⋅n=n⋅2n−1f(n) = C_n^1 \cdot 1 + C_n^2 \cdot 2 + \dots + C_n^n \cdot n = n\cdot 2^{n-1}f(n)=Cn1⋅1+Cn2⋅2+⋯+Cnn⋅n=n⋅2n−1
代码示例
n = int(input())
def quick_mod(n):
if n == 0:
return 1
if n == 1:
return 2
res = quick_mod(n // 2)
if n & 1 == 0:
return (res * res) % (10 ** 9 + 7)
else:
return 2 * ((res * res) % (10 ** 9 + 7)) % 10 ** 9 + 7
total_num = quick_mod(n * quick_mod(n - 1))
print(total_num)