圓桌上1000個人輪流開槍,最後活下來的是幾號?

圓桌上有1到1000號,1號右手邊是2號,左手邊是1000號。1號開槍打死2號,把槍交給3號,3號打死4號交給5號。。999號打死1000號後把槍交給1號,繼續循環。最後留下來的是幾號?

了解到這是約瑟夫環,解可以寫成 f(n)=2(n-2^{{lfloor log _{2}(n)
floor }})+1


977號。小學數學。
問題轉化。

(1)如果是只有2人,誰活?1號啊!
(2)那麼,4個人呢?
第一輪開槍結束,只剩2人,槍在1手中,所以顯然是1號;
(3)8個人呢?第一輪開槍結束,只剩4人,槍在1手中,由(2)討論,我們知道最後是1號;
……
(9)512人,第一輪開槍結束,只剩256人,槍在1手中,所以顯然是1號;

那麼1000……什麼,1000不是2的整數次方?

那想辦法划到512人去啊!

所以,考慮槍剛遞到誰手上,還剩的人數,剛好是512人即可。這個時候開槍的人,可以存活到最後。

顯然,到這個人手上時,已經開了488槍,那這個人應該是488*2+1=977號。

答,最後活下來的,是977號。


受眾知友的啟發,我突然有了一個思路。

一張圓桌,每一輪殺死近一半的人,那麼,從剩下的人的編號來研究一下,會怎麼樣呢?

第一輪完,剩1、3、5……997、999,編號形成以1開始,依次遞增2的等差數列,共500個。
第二輪完,剩1、5、9……993、997,編號形成以1開始,依次遞增4的等差數列,共250個。
第三輪完,剩1、9、17……985、993,編號形成以1開始,依次遞增8的等差數列,共125個。
第四輪,介於上一輪剩下的人數為奇數,所以這一輪的最後,1號會死在993號的手上,所以剩17、33、49……977、993,編號形成以17開始,依次遞增16的等差數列,共62個。
第五輪完,剩17、49、81……977,編號形成以17開始,依次遞增32的等差數列,共31個。
第六輪完,介於上一輪剩下的人數為奇數,所以這一輪的最後,17號會死在977號的手上,所以剩81、145、209……977,編號形成以81開始,依次遞增64的等差數列,共15個。
第七輪完,介於上一輪剩下的人數為奇數,所以這一輪的最後,81號會死在977號的手上,所以剩209、337、465……977,編號形成以209開始,依次遞增128的等差數列,共7個。
第八輪完,介於上一輪剩下的人數為奇數,所以這一輪的最後,209號會死在977號的手上,所以只剩465、721、977三個(等差為256)。
第九輪,465打死721後被977打死。

所以,977成為了最後的王者。


手機打字不易,大佬們給個贊可好?


如果有和我一樣邏輯能力為0,看不懂邏輯推理的朋友的話...

我們來玩找規律吧!


還有我想換個情景,不想回答無意義的應用題...

Josephus和n-1個大鬍子被特警包圍了, 然後他們決定去見真主.
他們圍城一個圈,從首領(1號)開始輪流槍斃自己右手邊的人.
但是 Josephus 是卧底他不準備死,那麼他應該站在哪個位置?

  • 1個人...一個人就算了,槍斃自己嗎
  • 2個人,槍斃2號結束,倖存者1號
  • 3個人,槍斃{2,1}結束,倖存者3號
  • 4個人槍斃{2,4}變成2人情形,槍斃3號結束,倖存者1號
  • .........................................

具體數學 P10

好,現在問題轉化為簡單的找規律了...

可以發現以2的冪劃分就是奇數....所以偶數就抱歉了

於是我們從 2^m 開始數 k 個人

 J(2^m+k)=2k+1

然後換元令 t=2^m+kRightarrow k=t-2^m

於是  J(t)=2(t-2^m)+1;m=lfloor log _{2}(t)
floor

這個公式給出了高贊的過程

總人數t=1000,減去低於1024的冪512,然後翻倍加一

(1000-512)	imes2+1=977


附加題 Anti-Josephus-Problem:

Josephus 深得首領器重,首領讓Josephus站自己旁邊(2號),然後徵求他的意見,應該隔幾個人槍斃.
如果你是 Josephus ,你必定能活下來嗎? 你應該怎麼回答?


為什麼2號要參加這個遊戲?


修改答案。。。
假設有1024人,當開槍殺死24人後,也就是49號接槍時,還剩1000人。這時讓49成為新1號,將原1 3 5 7……47號一共24人移到最後面,使之成為一條1000人的新隊伍,這時原1號,也就是幸運兒,會成為現在的1024-48+1=977號。

——以下是原答案——

當然是977號啦~
易知:當人數x=2、4、8、16、32、64....即2的n次方時,活下來的永遠是1號
那麼現在有1000個人,活下來的是誰呢?
由前面的易知得知,當n=10時,x=1024,我們可以理解成在一號前面再排24個人,我們給他們編號為-23、-22、-21……-1、0。現在讓-23開第一槍,打死-22,接著-21接過槍打死-20,由此循環,最終活下來的一定是-23。
那麼問題來了,-23是誰呢?
因為槍打完一圈是要輪到一號的,因此可以認為隊伍是繞成一個圓環的。我們可以這麼理解:把977號--1000號這24個人移到1號前面,使他們成為-23號--0號,這樣977號就成了那位幸運的-23號。
所以活下來的是977號


N個人,{p0, p1, p2 ... }

設 X(N) :X 是活下來的那位:pX

這個 X(N) 怎麼算?

首先 X(1) = 0 (N=1,一個人,活下來的只能是他)

然後 X(2N) = 2X(N)

為什麼?

2N個人,走完一輪,偶數都殺死右邊奇數。然後回到第一個人 p0。

活下來的還有N個人{p0,p2,p4...},所以第二輪相當於 X(N) 的情況。

但是要乘以2,把 {p0,p1,p2...} 映射到 {p0,p2,p4...}

而且 X(2N+1) = 2X(N) + 2

為什麼?

2N+1 個人,走完一輪,偶數豆沙四右邊奇數。但是最後一個人p2N殺死p0,所以輪到了p2。

活下來的還有N個人{p2,p4,p6...},所以第二輪也相當於 X(N) 的情況。

但是要乘以2,再加2,把 {p0,p1,p2...} 映射到 {p2,p4,p6...}

這三個規則已經夠了。

比如:

X(1000)

= 2X(500)

= 4X(250)

= 8X(125)

= 16X(62) + 16

= 32X(31) + 16

= 64X(15) + 64 + 16

= 128X(7) + 128 + 64 + 16

= 256X(3) + 256 + 128 + 64 + 16

= 512X(1) + 512 + 256 + 128 + 64 + 16

(結束了,總共九輪)

= 0 + 512 + 256 + 128 + 64 + 16

X(1000) = p976

[實際上是第977的人活下來,因為我們是從第一個人p0開始]

或者:

X(2017)

= 2X(1008) + 2

= 4X(504) + 2

= 8X(252) + 2

= 16X(126) + 2

= 32X(63) + 2

= 64X(31) + 64 + 2

= 128X(15) + 128 + 64 + 2

= 256X(7) + 256 + 128 + 64 +2

= 512X(3) + 512 + 256 + 128 + 64 + 2

= 1024X(1) + 1024 + 512 + 256 + 128 + 64 + 2

(結束了,總共十輪)

= 0 + 1024 + 512 + 256 + 128 + 64 + 2

X(2017) = p1986 (第1987的人)

好吧,全部換成二進位。。。

1000 的二進位:1111101000

X(1111101000)

= 10X(111110100)

= 100X(11111010)

= 1000X(1111101)

= 10000X(111110) + 10000

= 100000X(11111) + 10000

= 1000000X(1111) + 10000000 + 10000

= 10000000X(111) + 10000000 + 1000000 + 10000

= 100000000X(11) + 100000000 + 10000000 + 1000000 + 10000

= 1000000000X(1) + 1000000000 + 100000000 + 10000000 + 1000000 + 10000

= 0 + 1000000000 + 100000000 + 10000000 + 1000000 + 10000

X(1111101000) = p1111010000

i.e. X(1000) = p976

hmmm.... 二進位,這兩個數字長得很像啊。(而且這個後綴的積累方式很像)

2017呢。。。

X(11111100001) = p11111000010

i.e. X(2017) = p1986

這個機制,不就是把二進位大部分0,1都保留下來嗎?

只是前面的1不要,後面多加一個0。

又符合上面三個recursive規則

X(1) = 0

X(10N) = X(1abc...xyz0) = abc...xyz00 = 10X(1abc...xyz)

X(10N + 1) = X(1abc...xyz1) = abc...xyz10 = 10X(1abc...xyz) + 10

去掉最大的二進位1是什麼概念?

N -&> N - 2^floor(log(2,N))

後面加一個0是什麼概念?

N -&> 2N

所以我們終於可以確定: X(N) = 2(N - 2^floor(log(2,N)))

X(1000)

= 2(1000 - 2^floor(log(2,1000)))

= 2(1000 - 512)

= p976

(好吧,還是要+1, 因為我們都從0開始算的)

不好意思,剛看到問題,沒有整理,寫得比較亂;我也不會用latex

如果改規則,改成每個人開槍時殺死右邊的k個人,這就有k+1個recursive條件,要改成(k+1)進位空間去理解。


#跑題#

一號確實開槍幹掉了二號,本來應該把槍交給三號的,結果眾人突然齊刷刷地開口說『我覺得一號可以多干一屆』,場面一下子就尷尬了,三號只好表示『我無意接槍』然後示意一號親自開槍幹掉了四號。之後嘛,三號還不知死活,後面的誰接槍事就更不知道了


假設原來有1024個人,已經死了24個
於是時光倒流
把24個人復活一下看看槍在誰手上,
24個人插了23個空,
還原事故現場,
倒數第23個人正拿著槍,
遊戲開始。。
2的n次方數一定是第一個活著的。
倒數23就是現在的1號。
1000-23=977


我又最笨的方法推理了兩個小時左右


1. 將1000寫成2進位得1111101000
2. 將1111101000最高位移到末位1111010001
3. 1111010001轉為十進位得977
僅適用於n=2


第一輪,1號先開槍,剩下1、3、5……995、997、999,最後是999號殺1000號(此次人數為偶數,倒數第二位殺死倒數第一位,下同),槍交給1號,一共剩下500人;

第二輪,1號先開槍,剩下1、5、9……989、993、997,最後是997號殺999號,槍交給1號,一共剩下250人;

第三輪,1號先開槍,剩下1、9、17……977、985、993,最後是993號殺997號,槍交給1號,一共剩下125人;

第四輪,1號先開槍,剩下17、33、49……961、977、993,最後是993號殺1號(此次人數是奇數,倒數第一位殺死最前面的一位,下同),槍交給17號,一共剩下62人;

第五輪,17號先開槍,剩下17、49、81……913、945、977,最後是977號殺993號,槍交給17號,一共剩下31人;

第六輪,17號先開槍,剩下81、145、209……849、913、977,最後是977號殺17號,槍交給81號,一共剩下15人;

第七輪,81號先開槍,剩下209、337、465、593、721、849、977,最後是977號殺81號,槍交給209號,一共剩下7人;

第八輪,209號先開槍,剩下465、721、977,最後是977號殺209號,槍交給465號,一共剩下3人;

最後一輪,剩下977號(╯°Д°)╯︵┻━┻


scala&> def T(n: Int): Int = if (n == 1 || n == 2) 1 else if ( n % 2 == 0) 2 * T(n / 2) - 1 else 2 * T((n - 1) / 2) + 1
T: (n: Int)Int

scala&> T(1000)
res20: Int = 977


隔一個殺一個,非環狀約瑟夫抽殺最簡單,是小學奧數的學習內容。環狀的要難一點,是小學奧數高端學生學習內容。
隔兩個殺一個就麻煩了,尤其是非環狀,大學生普遍跪。


隨便寫代碼跑了下:

int main()
{
std::list& people;
for(int i=0;i&<1000;i++) { people.push_back(i+1); } while(people.size()&>1)
{
int criminal=people.front();
people.pop_front();
people.pop_front();
people.push_back(criminal);
}
std::cout&<&<"the winner is :"&<&

輸出:

the winner is 977


謝邀。結果應該是977。

Interesting problem! 感覺以前好像見過, 突然發現至今不會解析解 。 希望有數學大神能給出精妙解答(可能跟1000有關係?)

下面是我的一個演算法。 主要是基於每次循環後 n 是否能被2整除討論的。

# method 2
# setup
import numpy as np
n = 1000
a = [1]*n

res = 0 # indices we wanna know
k = 1
while n &> 1:
if n % 2 == 0:
n = n/2
else:
res = res + 2 * k
n = (n - 1)/2
k = 2 * k
print(res + 1) # 977

這個演算法是 O(log n) 的, 並且可以任意跟換n, 關鍵點是跟新array中的首項, 因為它才是留下來元素的起點。

可以和比較直接的遍歷方法進行比較(感覺應該是 O(n^2) , 當然還可以簡便些。)

# method 1
# setup
import numpy as np
n = 1000
a = np.ones(n, dtype = "int")

def next_nonzero(i, A, m):
"""find the next nonzero indice"""
for k in range(i + 1, m):
if A[k] != 0:
return k
for k in range(0, i):
if A[k] != 0:
return k

# remove nonzero element one by one
i = 0
while np.count_nonzero(a) &> 2:
j = next_nonzero(i, a, n)
i = next_nonzero(j, a, n)
a[j] = 0
print(i + 1) # 977

以上code中nonzero的element就是榮幸活下來的。

希望各路大神可以提出建議並且有更好的解答。


好的, 覺得此問題可以終結了。 ( ′? ??") 。 這是Josephus problem。 詳見

Josephus problem

f(n) = 2l + 1, 	ext{where} n = 2^m + l  	ext{and} 0 leq l < 2^m.

本題就是977.


顯而易見,第一圈下來消滅掉了所有偶數號,剩500人,並且槍回到1號

現在把所有人重新編號(1~500)
一圈下來同樣消滅掉所有偶數號,剩250人

同上一步,現在剩125人

繼續
很顯然,第124個人被幹掉之後,剩63人
槍會被交給最後一個人,然後1號就會被幹掉,接著是3號,不難想現在是消滅奇數項。
為了統一消滅偶數,我們把最後一個人消滅1號後算作一圈,把之前的號往前推1位,現在就是消滅偶數了。當然,剩的就是62個人了

所以又被消滅掉31個,剩31個,槍回到第一個人,現在消滅偶數

剩31個,和剩125個時一樣

然後15,7,3,1

emmmmmm,不過現在推號數成了個問題,慢慢來吧

〇:1,2,3,…,999,1000(1000)n+1

一:1,3,5,…,997,999(500)2n+1

二:1,5,9,…,993,997(250)4n+1

三:1,9,17,…,985,993(125)8n+1

四:17,33,…,977,993(62)16n+1+16

五:17,49,81,…,945,977(31)32n+1+16

六:81,145,209,…,913,977(15)64n+1+16+64

七:209,337,465,…,849,977(7)128n+1+16+64+128

八:465,721,977(3)256n+1+16+64+128+256

九:977(1)512n+1+16+64+128+256+512

對,你一定注意到了後面的式子

我們把這個方法可以歸納為:

一組人編號的通項公式為n+1(n=0,1,2,…)

Ⅰ如果這一組人數是偶數,人數直接除以2,通項公式中n的係數乘以2(如〇到一)

Ⅱ如果這一組人數是奇數,人數減1除以2,通項公式中n的係數乘以2,常數項中加上乘以2之後的n的係數(如三到四)

並且每一步的影響都要累計下來

因為最後只有一個人,把n=0代入最後的通項公式,即為最後的編號(你可以試試代一下上面第九步)

現在我們來這樣試一下:

1024
因為1024是2^10,每次都能整除,所以只用一直執行Ⅰ,最後的通項公式就是2^10n+1,所以1號存活

1023
因為1024是2^10-1,每次都不能整除,所以只用一直執行2,最後的通項公式就是2^9n+1023,所以1023號存活

100(n+1)
50(2n+1)
25(4n+1)
12(8n+1+8)
6(16n+1+8)
3(32n+1+8)
1(64n+1+8+64)
所以73號存活

至於為什麼
因為是隔一人給(開)槍,所以(這裡要簡單地推一下)每次係數乘以二
如果上次人數是偶數,槍會回到第一個人,首項不變,所以不加
如果上次人數是奇數,第一個人就會死,首項就變成原來第二個人,所以需要加中間間隔的數號,也就是n的係數(例如1,65,…係數就是64,中間間隔64,1(原第一項)死後第一項就加64)

沒時間了,說得很粗糙,大致地理解一下吧

對吼,直接用二進位表示1000=1111101000(2)
977=1111010001(2)
也就是說把二進位中第一位移到最後一位就行了。。。


感覺高票答案說的都有些太過複雜了,我來說說我的解答

不難知道

若是恰好有2的n次方個人,那麼活下來的人就一定是1號

那麼我們假設 共有1024個人 ,若要場上只剩下1000個人,那麼必須死去24個人,想要死去24個人,那麼就需要有48個人參與這個遊戲,所以,當47號開槍殺死48號時,49號露出了猥瑣且陰暗的笑容,這時場上就剩1000人了

此時 編號重排

49號成了1號,50號成了2號....以此類推
這個時候就出現了次方的輪迴,不管怎樣 活下來的都是1號,也就是977

所以 答案是977


這個題目從本質上來看,還是應該考慮二進位。首先1000=(1111101000)2

其中n=(abc)p,表示p進位下n的表示為(abc)

我們將一號視作第一次開槍的人。當槍被數碼較大的人交給數碼較小的人時,稱作過了一個回合。(比如說1、3、5……這些人開槍打死2、4、6……然後1再拿到槍,就過了一個回合)

假設現在到了一個新的回合,場上有
k=(a1a2……am)2
個人存活。(其中1、2、……、m為下標)
設他們是A1、A2、……、Ak

顯然,若am=1,則A1必死,且Ak存活。
若am=0,則A1存活,Ak必死。
而且這個回合死去了[(k+1)/2]個人。其中[x]表示x向下取整。
於是經過這個回合,場上只剩下k`=(a1a2……a(m-1))2
(其實就是將k的二進位表示下最後一位數碼抹去)

回到原題,1000=(1111101000)2
那麼最後五個回合的最後一個人一定不會死,所以他就是活到最後的那個人。

另外,如果對這1000個人進行賦值1-1000
那麼顯然第m個回合過後,存活的人一定模2的m次方同餘。(否則他將被前一個人殺死)

前三個回合1號一直存活,那麼三個回合之後,數字最大的那個人模8餘1。他是993號。

第四個回合1號死亡,993號存活。所以這個回合除1外,所有模16餘1的人存活。那麼數字最小的人是17號。

第五個回合17號存活,所以這個回合剩餘的人模32餘17。數字最大的人為977。

最後1000=(1111101000),接下來的五個回合977號都活了下來。所以他就是活到最後的那個人。

用類似的方法可以推廣到n的情況。


看了各位的回答終於想明白了,我也試著說說。
按照規則,人數是2的正整數次冪的情況下,永遠是第一個開槍的剩下,這個就不多解釋了。
那麼我們再來考慮人數是1000的情況。
這個情況可以認為是從距離這個數字最近的2的整數次冪即1024發展而來:
1024個人排排坐吃槍子。他們每人一個編號,就叫做a1號,a2號……a1024號好了。從a1號幹掉a2號開始玩,可以預見,最終必然是a1號勝出。

當a47號幹掉a48時,這時已經幹掉24人了,現場還有1000人,a49號拿槍,這時他說咱們重新編號吧,我是1號,a50是2號,a51是3號……a1024就是1024-48=976號,a1挨著a1024(圓桌嘛)就是977號……,他拿槍他說了算,現在就是題目里的情況,1000個人,拿槍的是1號,然而無論如何改變編號也無法改變既定的命運,最終必然還是a1勝出,也就是977號!


模仿@岳承宇 的思路,用mathematica來湊個熱鬧


推薦閱讀:

此圖像的參數方程應該是什麼?
數學中的「數」如果按照其所描述的範圍,由小到大應該如何排列?
為什麼對任何 N,N 是兩個平方數的和 <=> N^3 也是兩個(其他)平方數的和?
已知f(f(x)),在怎樣的條件下,可求f(x)?
如何證明加法交換律?

TAG:面試 | 數學 | 趣味數學 | 腦筋急轉彎 |