--- tags: uva --- # Uva10774 - Repeated Josephus ## 題目大意 有 n 個人,每個人被編號成 1 ~ n 號,我們每 2 個人就殺一個人 ex. 從 1 開始 2 殺掉 3 保留 4 殺掉.... 然後將最後生存下來的編號,作為新的 n ,直到舊的 n == 最後生存下來的編號為止,並輸出跑過的回數與此編號。 ## 重點觀念 - Joseph Ring - [參考資料](https://blog.csdn.net/zhongkelee/article/details/40594147) - 數學: f[1] = 0, f[i] = (f[i-1]+k)%i (k 是 每幾個人殺掉, 求到 f[n] 再加一即是答案) ## 分析 - 因為只需要最後一個人的號碼,可以直接以數學求解 ## 程式題目碼 ```cpp= #include <iostream> using namespace std; int josephus(int n, int k) { int f = 0; for (int i = 2; i <= n; i++) { f = (f + k) % i; } return f + 1; } int main() { int t; cin >> t; for (int i = 1; i <= t; i++) { int n; cin >> n; int round = 0; while (++round) { int survivor = josephus(n, 2); if (survivor == n) { break; } n = survivor; } cout << "Case " << i << ": " << round - 1 << " " << n << endl; } return 0; } ```