题目链接:https://codeforces.com/contest/1370/problem/C
题意
给出一个正整数 $n$,Ashishgup 和 FastestFinger 依次选择执行以下一个操作:
- 如果 $n > 1$,使 $n$ 除以一个奇因子
- 如果 $n > 1$,使 $n$ 减一
若一方不能操作,则另一方胜利。
题解
奇数根据 $n = 1$ 分为两种情况。
偶数根据是否含有奇因子分为两种情况,不含奇因子根据是否为 $2$ 分为两种情况,含有奇因子根据 $2$ 的个数和奇因子的个数分为四种情况。
代码一
#include <bits/stdc++.h> using namespace std; bool isprime(int n) { for (int i = 2; i * i <= n; i++) if (n % i == 0) return false; return true; } void solve() { int n; cin >> n; char ans = 'X'; if (n & 1) ans = (n == 1 ? 'F' : 'A'); else if ((n & (n - 1)) == 0) ans = (n == 2 ? 'A' : 'F'); else ans = (isprime(n / 2) ? 'F' : 'A'); cout << (ans == 'A' ? "Ashishgup" : "FastestFinger") << "\n"; } int main() { int t; cin >> t; while (t--) solve(); }
代码二
#include <bits/stdc++.h> using namespace std; void solve() { int n; cin >> n; if (n & 1) { cout << (n == 1 ? "FastestFinger" : "Ashishgup") << "\n"; } else { int odd_div = INT_MAX; for (int i = 2; i * i <= n; i++) { if (n % i == 0) { if (i & 1) { odd_div = min(odd_div, i); } else { int j = n / i; if (j & 1) odd_div = min(odd_div, j); } } } cout << ((odd_div != INT_MAX and n / odd_div != 2) or n == 2 ? "Ashishgup" : "FastestFinger") << "\n"; } } int main() { int t; cin >> t; while (t--) solve(); }