1 条题解

  • 0
    @ 2025-10-8 16:57:45
    #include <bits/stdc++.h>//打表存所有必败态
    using namespace std;
    int a[1000005];
    int main() {
        memset(a, 0, sizeof(a));
        a[0] = 0;
        for (int i = 1, k = 1; i <= 1000000; ++i)
            if (a[i] == 0) {
                a[i] = i + k;
                if (i + k <= 1000000) a[i + k] = -1;
                k++;
            }
        int T; scanf("%d", &T);
        for (int i = 1; i <= T; i++) {
            int n, m; scanf("%d%d", &n, &m); if (n > m) swap(n, m);
            if (a[n] == m) puts("Farmer John");
            else puts("Bessie");
        }
        return 0;
    }
    
    #include <bits/stdc++.h>//打表存所有必败态(unordered_map版)
    using namespace std;
    unordered_map<int, int> a;
    int main() {
        a[0] = 0;
        for (int i = 1, k = 1; i <= 1000000; ++i)
            if (a.find(i) == a.end()) {
                a[i] = i + k;
                a[i + k] = i;
                k++;
            }
        int T; scanf("%d", &T);
        for (int i = 1; i <= T; i++) {
            int n, m; scanf("%d%d", &n, &m);
            puts(a[n] == m ? "Farmer John" : "Bessie");
        }
        return 0;
    }
    

    用公式,当 $n = \lfloor \frac{ \sqrt(5) + 1 }{2} \times (m - n) \rfloor$ 时,(n,m)(n, m) 为必败态

    #include <bits/stdc++.h>
    using namespace std;
    int main() {
        int T; scanf("%d", &T);
        for (int i = 1; i <= T; i++) {
            int n, m; scanf("%d%d", &n, &m); if (n > m) swap(n, m);
            double ans = (sqrt(5.0) + 1) * 0.5 * (m - n);
            if (n == (int)ans) puts("Farmer John");
            else puts("Bessie");
        }
        return 0;
    }
    
    • 1

    【模板】威佐夫博弈 /[USACO11OPEN] Cow Checkers S

    信息

    ID
    1548
    时间
    1000ms
    内存
    128MiB
    难度
    6
    标签
    递交数
    57
    已通过
    19
    上传者