链接:https://ac.nowcoder.com/acm/contest/11424/G
来源:牛客网
题目描述
Nancy喜欢博弈!
Johnson和Nancy得到了一个神奇的多重集合,仅包含一个正整数n,两个人轮流进行操作。
一次操作可以将集合中一个数字分解为它的任意两个非1的因数,并加入集合中。
他们想知道,在Johnson和Nancy绝顶聪明的情况下,如果Nancy先手进行操作,最后谁没有办法继续操作了呢?
输入描述:
第一行:一个整数n。
数据满足:1 \leq n \leq 957181≤n≤95718。
输出描述:
共一行:一个字符串,表示最后谁(Johnson或者Nancy)无法进行操作。
示例1
输入
复制
4
输出
复制
Johnson
可操作次数,就是n的质因数个数-1。比如8=222,3个质因数,可进行两次分解操作,再如40=222*5,4个质因数,3次分解操作。
除此之外,注意n=1时为特例,0次分解操作。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <set>
#include <string>
#include <queue>
#include <map>
#include <stack>
#include <map>
#include <unordered_map>
#include <vector>
#include <cmath>
#include <ext/rope>
#include <bits/stdc++.h>
using namespace std;
#define gt(x) x = read()
#define int long long
#define ios ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
const int mod = 20010905;
const int PP = 131;
inline int read(int out = 0)
{
char c;
while((c=getchar()) < 48 || c > 57);
while(c >= 48 && c <= 57) out=out*10+c-48,c=getchar();
return out;
}
const int N = 1e5 + 10;
const int M = 1e6 + 10;
signed main(){
int n;
gt(n);
if (n == 1) cout << "Nancy" << endl;
else{
int cnt = 0;
for (int i = 2; i <= n; i ++){
while(n % i == 0) n /= i, cnt ++;
}
cnt --;
if (cnt & 1) cout << "Johnson" << endl;
else cout << "Nancy" << endl;
}
return 0;
}