牛客题解 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;
}