洛谷P1290 欧几里德的游戏

链接:https://www.luogu.com.cn/problem/P1290

不妨假设\(b\leq a\)
显然,当\(a\)\(b\)的倍数时,为必胜态。
接下来考虑\(a\)不为\(b\)的倍数时:
1.\(a\)小于\(2*b\)时,当前的人只能将较大的数减去较小的数,直到出现必胜态,根据出现必胜态之前进行的轮数,判定当前为必胜态或必败态。

2.\(a\)大于等于\(2*b\)时,当前操作可以转移到1.中的情况或者1.中情况的上一轮,也就是说,一定可以转移到必胜态。

因此,我们只需找到谁能抢先达到必胜态。

void solve() {
    int a, b;
    cin >> a >> b;
    int cnt = 0;
    if (a < b) swap(a, b);   
    if (a % b != 0 && a / b <= 1) {
        while (a % b != 0 && a / b <= 1) {
            a -= b;
            if (a < b) swap(a, b);
            cnt ++;
        }
    }
    cout << ((cnt & 1) == 0 ? "Stan wins\n" : "Ollie wins\n");
}
posted @ 2022-09-20 19:33  Coldarra  阅读(25)  评论(0)    收藏  举报