码迷,mamicode.com
首页 > 其他好文 > 详细

Codeforces Round #651 (Div. 2) C. Number Game(数论)

时间:2020-06-21 19:40:19      阅读:44      评论:0      收藏:0      [点我收藏+]

标签:def   依次   while   bool   数论   ret   http   min   ash   

题目链接: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();
}

 

Codeforces Round #651 (Div. 2) C. Number Game(数论)

标签:def   依次   while   bool   数论   ret   http   min   ash   

原文地址:https://www.cnblogs.com/Kanoon/p/13173450.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!