问题描述
现有 n n n个人,从中选择任意数量的人组成一支队伍,再从这些人中选出1名队长,求不同方案数对 ∣ 1 0 9 + 7 ∣ |10^9 + 7| ∣109+7∣ 的结果。如果两个方案选取的人的集合不同或选出的队长不同,则认为这两个方案是不同的。求输入任意人数 n n n得到的队伍数。
问题分析
典型的排列组合问题。因为从
n
n
n个人中选择任意数量的人组成队伍,则依次有
C
n
1
,
C
n
1
,
…
,
C
n
n
C_n^1, C_n^1, \dots, C_n^n
Cn1,Cn1,…,Cnn中选择方式。然后,在这些队伍中选择一个人作为队长,即可解决问题。
具体地,
f
(
n
)
=
C
n
1
⋅
1
+
C
n
2
⋅
2
+
⋯
+
C
n
n
⋅
n
=
n
⋅
2
n
−
1
f(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)