【題目敘述】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;
}