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

算数基本定理:
任何一个大于1的自然数 N ,如果 N不为质数,都可以 唯一分解成有限个质数;
这个定理的证明比较繁琐,而且对于我们做题没什么实际的研讨价值,有兴趣的同学可以在百度百科自行了解一下。
这个定理为我们提供了一些非常有用的性质。

首先,都可以 说明每个数字都是由若干个素数组成的。其次, 唯一 说明只要有一个Pi或者ai不同,那么一定对应了两个不同的 N。
所以,对这个数N分解质因数就可以了。
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int pri[100000], cnt[100000];
int main()
{
	int ans = 0, res = 1;
	memset(pri, 1, sizeof(pri));
	for (int i = 2;i <= 95720;i++)
		if (pri[i])
			for (int j = i + i;j <= 95729;j+=i)
				pri[j] = 0;
	for (int i = 2;i <= 95720;i++)
		if (pri[i])
			cnt[res++] = i;
	/*for (int i = 1;i < 100;i++)
		cout << cnt[i] << " ";*/
	int n;
	cin >> n;
	if (pri[n])
	{
		cout << "Nancy" << endl;
		return 0;
	}
	int i = 1;
	while (n > 3 && i < res)
	{
		if (n % cnt[i] == 0)
		{
			ans++;
			n /= cnt[i];
            if(pri[n])
                break;
		}
		else
		{
			i++;
		}
	}
	if (ans % 2 == 1)
		cout << "Johnson" << endl;
	else
		cout << "Nancy" << endl;
	return 0;
}
求牛币,qwq。