C. Number Game(数字博弈)

考虑一下明显的必败态和必胜态

. 1 , Ⅰ.如果给我的是一个1,那么必败

. 2 , 1 , Ⅱ.如果给我的是一个2,那么我减去1,必胜

. , Ⅲ.如果给我的是一个没有奇数因子的偶数,必败

1 , . 1 因为我被迫减去1,得到一个奇数.那么对手一定除以自身返回1给我

, , \color{Red}如此一来,想赢,就要尽可能构造情况Ⅲ

特判一下初始数是1和2的情况

. \color{Red}一.初始数是奇数

1 , 我除以自身返回1给对手,我必胜

. \color{Orange}一.初始数是偶数

? 能不能构造情况Ⅲ呢?

扫描二维码关注公众号,回复: 11337016 查看本文章

, a b 这么想吧,一个偶数可以拆分为a个奇数因子和b个偶数因子相乘

b , a b个偶数相乘一定是偶数,那么这a个奇数因子乘在一起也一定是奇数

, a x , x , 如此一来,把a个奇数因子记作x,我除以x,得到的是一个没有奇数因子的偶数

, , 1 , 1 , 对手拿到这个数,哎呀,被迫减1,那我们得到不为1的奇数,除以自己

1 . : 返回一个1给对手.对手:我***

赢了。

补充

可能我还没有讲清楚补充一点

2 当我们除以奇数因子后得到的是一个偶数,而且偶数不能为2

2 1 1 , 因为是2的话对手仍然是被迫减1得到1给我们,但是此时我们却输了

2 [ ] 所以特判一下除以后是否是2[代码中有判断的]

#include <bits/stdc++.h>
using namespace std;
int t,n;
int main()
{
	cin >> t;
	while(t--)
	{
		cin >> n;
		if(n==1)	cout<<"FastestFinger";
		else if(n==2)	cout<<"Ashishgup";
		else if(n%2==1)	cout<<"Ashishgup";
		else
		{
			int flag=0,z=sqrt(n);
			for(int i=2;i<=z;i++)//只要找到有奇数因子就行 
			{
				if(n%i!=0)	continue;
				if(i%2==1&&(n/i)!=2)	flag=1;
				if((n/i)%2==1&&i!=2)	flag=1;
			}
			if(flag)	cout<<"Ashishgup";
			else	cout<<"FastestFinger";
		}
		cout<<endl;
	}
}

猜你喜欢

转载自blog.csdn.net/jziwjxjd/article/details/106881124
今日推荐