某部門共有n
nn個人,現在需要從所有人中選出任意數量(大於0)的人組成乙個小隊,並從中選出乙個隊長,那麼一共有多少種組隊方式?其中1≤n
≤109
1≤n≤10^9
1≤n≤10
9,由於組隊方式的數目可能會很大,請將結果對(10
9+7)
(10^9+7)
(109+7
)取餘後輸出。
輸入: 2
輸出: 4
如果將2個人記為「1」和「2」,則共有4種組隊方式(其中上方帶點標記的為隊長):
1˙̇},
2˙},
1˙, 2},
2˙}按排列組合的方式直接解,隊伍人數為i(1
≤i≤n
)i(1\leq i \leq n)
i(1≤i≤
n)的情況有cni
c_n^i
cni
種,其中每一種又對應i
ii種情況(每個人都可以被選為隊長),則總共的組隊方式數目為
∑ i=
1ni⋅
cn
i\sum_^i \cdot c_n^i
∑i=1n
i⋅cn
i其中c ni
c_n^i
cni
表示組合數,即在n
nn個物件中選擇i
ii個物件的選擇方式的數目。對應的**為
// 思路1
deffnc
(a,b)
:if b ==0:
return a
elif b == a:
return
1 ans =
1 num, den = a, b
for _ in
range
(b):
ans *= num / den
num -=
1 den -=
1return ans
n =int
(input()
)mod =
int(
1e9+7)
ans =
0for i in
range(1
,n+1):
ans += i * fnc(n,i)
% mod
print
(int
(ans)
)
經測試,這種方式不是溢位就是超時,無法通過。
最後組成的隊伍中必然有乙個隊長,這個隊長可能是n
nn個人中的任意乙個,那麼隊長是任意乙個人的組隊方式相等,也就是說總的組隊方式數必然是乙個數量的n
nn倍,將那個數目記為x
xx(總數目為nxnx
nx),接下來考慮x
xx的值;
已經有乙個人被選為隊長了,其餘的人構成乙個集合,那麼在這個集合中任選乙個子集即可與隊長組成隊伍(即便是空集也可以),由於剩下的一共有(n−
1)
(n-1)
(n−1
)個人,則x
xx便等於子集的總數2n−
12^
2n−1
,於是nx=
n⋅2(
n−1)
nx = n \cdot 2^
nx=n⋅2
(n−1
)這樣,我們直接求出了解析解。
觀察這個表示式以及n
nn的取值範圍,顯然,接下來我們將面臨2個問題:
若直接使用冪函式計算,則必然溢位;
考慮同餘定理,使用迭代的方式對進行運算且在每次迭代時均進行取餘運算,演算法複雜度為o(n
)o(n)
o(n)
,必然超時。
可以對2(n
−1)2^
2(n−1)
不斷進行二分拆分,最終達到o(o(
o(log(n
))
(n))
(n)
)的複雜度;在每次拆分時都進行一次取餘運算,以避免溢位。前者解決了超時問題,後者解決了溢位問題。最終**
// 思路2
defpower_mod
(n, mod)
:if n ==1:
return
2elif n %2==
0:return
(power_mod(n /
2, mod)**2
)% mod
else
:return power_mod(n //
2, mod)**2
*2% mod
n =int
(input()
)mod =
int(
1e9+7)
pm = power_mod(n -
1, mod)
res = n * pm % mod
print
(res)
經測試,即使在膝上型電腦上,對於n=1
09
n=10^9
n=10
9的極限情況也可以瞬間算出結果。
騰訊2016實習筆試 n階蛇形矩陣
題目描述 輸入乙個整數n,從上到下 從左到右列印n階蛇形矩陣。例如輸入整數4,輸出為 1 2 3 4 12 13 14 5 11 16 15 6 10 9 8 7 分析 生成乙個n階初始值為0的矩陣,從 0 0 位置開始依次向右 向下 向上 向左移動,每移動一次,填充乙個自增1的數。移動方向變化的條...
N人圍桌問題
今天天氣挺好 不用加班 找出我的演算法書,看上幾頁,覺得這個問題挺好玩,隨手記一下。約瑟夫環問題,n人圍桌問題,第m個人離開,直到最後乙個人的時候結束 author administrator 2018年12月9日 下午4 14 45 public class josephus public lis...
騰訊筆試 資料庫問題
題目描述 設檔案f具有10000個記錄,每個記錄50位元組,其中10位元組用來表示檔案的鍵值。每個磁碟塊大小1000位元組,指向磁碟塊的指標佔5位元組,不允許記錄跨兩個塊。1 如果為檔案f建立簡單的hash索引,使用100個hash桶,則桶目錄需要多少磁碟塊?平均每個桶需要多少磁碟塊?2 如果為檔案...