ZOJ - 3529 A Game Between Alice and Bob 尼姆博弈+质因子个数

题目链接:点击查看

题意:给出n个数,每轮可以把某个数变成他的因子,先手获胜输出Alice 和 他第一次可以操作的最靠前的数字

题解:把这个数变成他的因子,这不就相当于,除掉了几个质因数吗,这不就是取掉几个石子吗,这不就是尼姆博弈吗,为啥当时脑子瓦特了。。。。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int ok[5000100],prime[500010],len;
int n,a[100010];
void init()
{
	for(int i=2;i<=5000000;i++)
	{
		if(!ok[i]) prime[len++]=i;
		for(int j=0;j<len&&(ll)prime[j]*i<=5000000;j++)
		{
			ok[i*prime[j]]=1;
			if(i%prime[j]==0) break;
		}
	}
}
int cul(int x)
{
	int res=0;
	for(int i=0;i<len&&(ll)prime[i]*prime[i]<=x;i++)
	{
		while(x%prime[i]==0)
		{
			x/=prime[i];
			res++;
		}
	}
	if(x>1) res++;
	return res;
}
int main()
{
	init();
	int nn=1;
	while(~scanf("%d",&n))
	{
		int ans=0,x;
		for(int i=1;i<=n;i++)
		{
			scanf("%d",&x);
			a[i]=cul(x);
			ans^=a[i];
		}
		printf("Test #%d: ",nn++);
		if(!ans) printf("Bob\n");
		else
		{
			int cnt;
			for(int i=1;i<=n;i++)
			{
				cnt=ans^a[i];
				if(a[i]>=cnt)
				{
					printf("Alice %d\n",i);
					break;
				}
			}
		}
	} 
	return 0;
}

猜你喜欢

转载自blog.csdn.net/mmk27_word/article/details/89006283