【題解】ZeroJudge c108: 00305 – Joseph

【題目敘述】https://zerojudge.tw/ShowProblem?problemid=c108
【解題想法】

  • 0<k<14,但題目會多次反覆詢問,所以先把答案計算出來備用,才不會TLE。
  • 從 k+1 開始枚舉可能的 m,直到符合題意。
    • k + 1 <= m <= 2k
    • 3k + 1 <= m <= 4k
    • 即 (m – 1) % 2k >= k
#include <iostream>
using namespace std;

int main() {
    int ans[14] = {0};
    int total, kill, cnt;
    for (int k = 1; k < 14 ; k++){
        total = 2 * k;
        for (int m = k+1; ; m++){
            if ((m-1) % total >= k){
                kill = (m - 1) % total;
                for (cnt = 2; cnt <= k; cnt++){
                    kill = (kill + m - 1) % (total - cnt + 1);
                    if (kill < k) break;
                }
                if (cnt == k+1) {
                    ans[k] = m;
                    break;
                }
            }
        }
    }
    int k;
    while (cin >> k){
        if (k == 0) break;
        else cout << ans[k] << "\n";
    }
    return 0;
}
分享本文 Share with friends