牛客题解 Game

链接:https://ac.nowcoder.com/acm/problem/201610
来源:牛客网

题解

作者 岛田小雅

问:在什么情况下当前回合选手不能进行操作?答:当分解出来的所有因数都是质数的时候。

那么这道题其实就是在问:整型 \(n\) 里有多少个质因子。

\(n\) 的范围是 \(1\leqslant{n}\leqslant{95718}\),直接暴力模拟应该是可行的。

我们先用线性筛法把所有小于等于 \(n\) 的质数都弄到一个 \(\texttt{set}\) 容器里,然后对游戏过程进行模拟,模拟过程请参见 AC 代码。

需要注意的是因为 \(n=1\) 属于一个特例,我们需要进行特殊判断。

AC 代码

作者 岛田小雅
#include <bits/stdc++.h>
using namespace std;

set<int> prime;
int n;
bool vis[95719];
int ans;

void generate_primelist()
{
    for(int i = 2; i <= n; i++)
    {
        if(vis[i]) continue;
        prime.insert(i);
        int x = i;
        while(x <= n)
        {
            vis[x] = true;
            x += i;
        }
    }
}

int main()
{
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    cin >> n;
    if(n == 1) goto N; // n=1的特判
    generate_primelist();
    for(auto it = prime.begin(); it != prime.end();)
    {
        if(prime.find(n) != prime.end()) break; // 如果剩下的数已经是质数,操作次数就不能再增加了。因为不能对一个质数进行操作。
        if(n%(*it) != 0)
        {
            it++;
            continue;
        }
        ans++;
        n /= *it;
    }
    if(ans&1) goto J;
    else goto N;
    return 0;
    N: cout << "Nancy";
    return 0;
    J: cout << "Johnson";
    return 0;
}
posted @ 2022-09-21 16:22  岛田小雅  阅读(32)  评论(0编辑  收藏  举报