騰訊筆試 n人組隊問題

2021-10-23 18:56:57 字數 2554 閱讀 6590

某部門共有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 如果為檔案...