Codeforces Round #651 (Div. 2) C. Number Game(数论)
Posted kanoon
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #651 (Div. 2) C. Number Game(数论)相关的知识,希望对你有一定的参考价值。
题目链接: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") << " "; } 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") << " "; } 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") << " "; } } int main() { int t; cin >> t; while (t--) solve(); }
以上是关于Codeforces Round #651 (Div. 2) C. Number Game(数论)的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #651 (Div. 2) E - Binary Subsequence Rotation 思维
Codeforces Round #651 (Div. 2) C. Number Game (博弈,数学)
Codeforces Round #651 (Div. 2) D. Odd-Even Subsequence(二分)
Codeforces Round #651 (Div. 2) D - Odd-Even Subsequence 二分