今天考試t2掛了(眾人皆a我獨掛),於是寫乙個關於約瑟夫類問題的心得。
約瑟夫問題:n個人(編號1~n),從1開始報數,報到m的退出,剩下的人繼續從1開始報數。按順序輸出列者編號
參圖示。
模擬是$o(nm)$的,然後我就死了。n,m給到1e8。
做這麼多年題大體上發現,如果你的解法超時,多半是因為處理了許多沒有用的資訊。
那麼看一看模擬處理出了那些沒用資訊:他可以知道每一輪誰死了。但是題目不需要知道這些,總之一駝人之前死掉了就可以了。
那麼我們可以這麼想,要求:在不能知道每一輪是誰死了的情況下求出勝者。
如果這個問題解決那麼它應該是符合時間限制的。
切換思路:我們考慮的時候,不把它考慮成2死了然後就沒有2了,而是考慮成2死了就把2的編號重新賦給乙個人。這是解題的關鍵。
然後就緊緊抓住這個進行計算,首先我在最後一輪的勝者必定是0,因為只有乙個人,然後我就關注這個人的編號是怎麼變化的就行了。
然後就可以推回去,每次根據標的號和人一層一層退回去。
具體來說:剩i個人,第n+1-i個人:那麼一定是從0開始找m個人,設為k,那麼k=(m%i)-1號會死。
即:0,1,2,……,k-1,k,……,n-i
然後我們把k乾掉,重新編號。
k+1,……,n-i,0,1,2,……k-1
0,1,……n-i-k,k,k+1,……n-i-1
重新標號的規則就是id'=(id-k)%i
然後我們就可以通過標號的一次次變化來遞推了。
f[i]=(f[i-1]+m)%i
#includeusing超長namespace
std;
int f[100000020
],n,m;
intmain()
約瑟夫問題 約瑟夫環
約瑟夫 問題 有時也稱為約瑟夫斯置換,是乙個出現在電腦科學和數學中的問題。在計算機程式設計的演算法中,類似問題又稱為約瑟夫環。又稱 丟手絹問題 據說著名猶太歷史學家 josephus有過以下的故事 在羅馬人占領喬塔帕特後,39 個猶太人與josephus及他的朋友躲到乙個洞中,39個猶太人決定寧願死...
約瑟夫問題 約瑟夫環
約瑟夫問題 有時也稱為約瑟夫斯置換,是乙個出現在電腦科學和數學中的問題。在計算機程式設計的演算法中,類似問題又稱為約瑟夫環。又稱 丟手絹問題 據說著名猶太歷史學家 josephus有過以下的故事 在羅馬人占領喬塔帕特後,39 個猶太人與josephus及他的朋友躲到乙個洞中,39個猶太人決定寧願死也...
約瑟夫問題
這是17世紀的法國數學家加斯帕在 數目的遊戲問題 中講的乙個故事 15個教徒和15 個非教徒在深海上遇險,必須將一半的人投入海中,其餘的人才能倖免於難,於是想了乙個辦法 30個人圍成一圓圈,從第乙個人開始依次報數,每數到第九個人就將他扔入大海,如此迴圈進行直到僅餘15個人為止。問怎樣排法,才能使每次...