上週我參加了Facebook黑客杯的第1b輪。約瑟夫斯爲大n(Facebook黑客杯)
一個問題基本上是Josephus problem
我作爲一個離散數學問題之前,約瑟夫問題的研究,所以我基本上了解如何獲得復發:
f(n,k) = (f(n-1,k) + k) mod n, with f(1,k) = 0
但是,沒在Facebook黑客杯中工作,因爲n的最大值是10^12。 k的mak值是10^4。
當k很小,n很大時,維基百科提到了一種方法。基本上從一輪中刪除人員,然後重新編號。 但它沒有描述太多,我不明白爲什麼重新編號的作品。
我看了解解決方案的示例工作源代碼,但我仍然不明白最後部分。
long long joseph (long long n,long long k) {
if (n==1LL) return 0LL;
if (k==1LL) return n-1LL;
if (k>n) return (joseph(n-1LL,k)+k)%n;
long long cnt=n/k;
long long res=joseph(n-cnt,k);
res-=n%k;
if (res<0LL) res+=n;
else res+=res/(k-1LL);
return res;
}
我真不明白,從res-=n%k
開始(此後線)的一部分。你如何得出這是調整結果的方法?
有人可以展示推理背後的推理嗎?或者是一個派生它的鏈接? (我沒有在UVA或topcoder論壇上找到任何信息)
最後一個`else`屬於哪個`if`? – biziclop 2011-01-30 21:06:36
@biziclop - 是不是很明顯它屬於最後一個...? – IVlad 2011-01-30 21:14:49