题意
- 对于一个数n,两个人每次可以把它拆分成两个因数,没得拆的人输,给定n,判断胜负情况
思路
- 对任何一个数,最终一定会被拆成它的质因数分解形式,然后无法继续拆解
- 而中途的拆法并不影响结果
- 每次拆会使得总数+1,总共能拆因子个数-1次
- 如果质因数分解有奇数个因子,先手必败
- 反之后手必败
代码
#include<bits/stdc++.h>
using namespace std;
int prime[100000];
int vis[100000];
int cnt=0;
void sieve(int lim){
for(int i=2;i<=lim;i++){
if(!vis[i]){
vis[i]=1;
prime[++cnt]=i;
}
for(int j=1;j<=cnt;j++){
if(i*prime[j]>lim||vis[i*prime[j]]) break;
vis[i*prime[j]]=vis[i]+vis[prime[j]];
}
}
}
int main(){
int n;
cin >> n;
sieve(n);
cout << (vis[n]%2?"Nancy":"Johnson") << endl;
}