兩人輪流報價,每次可在上次基礎上加 1~n。先報到 ≥ m 者勝。求先手必勝的首報價格集合。輸出所有可行首報價,若無則輸出 "none"。
標準巴什博奕:每次取 1~n,拿走最後一個勝。先手勝 ⇔ m % (n+1) ≠ 0,首取 m % (n+1)。
本題變體:目標是「報到 ≥ m」,且首報價可在 1~m 任意選。分析得:
• 若 M % (N+1) == 0 → 先手必敗,輸出 none。
• 否則首報價為 s = M % (N+1),以及 s + (N+1), s + 2(N+1), ... 直到 ≤ N(首報價不能超過 N)。
#include <cstdio>
int main() {
int M, N;
while (scanf("%d%d", &M, &N) == 2) {
int r = M % (N + 1);
if (r == 0) { puts("none"); continue; }
printf("%d", r);
for (int i = r + N + 1; i <= N; i += N + 1)
printf(" %d", i);
puts("");
}
return 0;
}