题目描述
Nancy喜欢博弈!
Johnson和Nancy得到了一个神奇的多重集合,仅包含一个正整数n,两个人轮流进行操作。
一次操作可以将集合中一个数字分解为它的任意两个非1的因数,并加入集合中。
他们想知道,在Johnson和Nancy绝顶聪明的情况下,如果Nancy先手进行操作,最后谁没有办法继续操作了呢?
输入描述:
第一行:一个整数n。
输出描述:
共一行:一个字符串,表示最后谁(Johnson或者Nancy)无法进行操作。

思路:
其实就是看正整数n有多少个质因数,如果质因数有偶数个,那么会进行奇数次回合,每次会多增加一个数,结束时候是全都是质数。
那么只要看质因数的个数的奇偶性就好了。注意一下如果n=1,即已经不能操作了,先手也没法取。

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n;
    while(cin>>n){
        int sum=0;
        for(int i=2;i*i<=n;i++){
            if(n%i==0){
                while(n%i==0) n/=i,sum++;
            }
        }
        if(n!=1) sum++;
        sum--;//进行的回合数 因为开始已经有一个数了
        puts(sum%2==0 || sum==-1?"Nancy":"Johnson");
    }
    return 0;
}