题目描述
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; }