每次操作可以将集合中的一个数字分解为它的任意两个非1的因数, 集合中的数字个数+1。
因为 质因数 是无法再被分解的,所以最后集合中的数全为 n 的质因数。因此只需要看题目给定的 n 有多少个质因数。假设 n 有 p 个质因数,那么这场游戏将进行 p-1 次操作(每次操作后集合中的数字个数+1),如果 p-1 为奇数那么后手便无法再进行操作,如果 p-1 为偶数则先手再无法进行操作。

注意:n==1 的情况要特殊处理一下.

AC代码如下:

#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <vector>

using namespace std;
#define mem(a, b) memset(a, b, sizeof(a))
#define PI acos(-1)
#define debug(a) cout << (a) << endl
typedef long long ll;
int dir8[8][2] = { { 1, 0 }, { 0, 1 }, { -1, 0 }, { 0, -1 }, { 1, 1 }, { 1, -1 }, { -1, 1 }, { -1, -1 } };
int dir4[4][2] = { 1, 0, 0, 1, -1, 0, 0, -1 };
const int INF = 0x3f3f3f3fLL;
const long long LLF = 0x3f3f3f3f3f3f3f3fLL;
const int MAXn = 95718 + 15;
const int mod = 20010905;

int s[MAXn];
int main()
{
    int n;
    int cnt=0;
    cin>>n;
    if(n==1){ //特殊处理 n==1
        printf("Nancy\n");
        return 0;
    }
    for(int i=2;i<=n;i++){ //求质因数个数
        while(n%i==0)
        {
            n/=i;
            cnt++;
        }
    }
    if(cnt%2==0) //判奇偶
        printf("Johnson\n");
    else printf("Nancy\n");
    return 0;
}