1 条题解
-
0
#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$ 时, 为必败态
#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
信息
- ID
- 1548
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 6
- 标签
- 递交数
- 57
- 已通过
- 19
- 上传者