CF150A Win or Freeze

列举一下可能出现的几种情况:

  1. $ q $ 是一个质数或者 $ q = 1 $ ,开始就无法操作,玩家一必胜,直接在第一行输出 1 ,第二行输出 2 。

  2. 如果 $ q $ 不是质数,我们就可以开始找规律。

    • 如果 $ q $ 是 12 ,此时 12 的因子有 1 , 2 , 3 , 4 , 6 , 12 , 这时玩家一选择 3 ,玩家二只能选择 2 ,所以玩家一获胜。
    • 如果 $ q $ 是 6 ,此时 6 的因子有 1 , 2 , 3 , 6 ,这时玩家一不管选择 2 还是 3 ,玩家二都无法操作,所以玩家二获胜。
    • 如果 $ q $ 是 30 ,此时 30 的因子有 1 , 2 , 3 , 5 , 6 , 10 , 15 , 30 ,这时玩家一可以选择 2 或 3 或 5 ,玩家二不管怎么操作,玩家一都不能操作玩家二操作过的数,所以玩家一获胜。

    这时可以发现:如果一个数的因子如果能超过两个,那么玩家一获胜,否则玩家二获胜。

代码:


#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
using namespace std;
typedef long long ll;
ll z,n;
bool ss(ll x)
{
	if(x==1) return true;
	for(ll i=2;i<=sqrt(x);++i)
	    if(x%i==0) return false;
	return true;
}
ll pd1(ll x)
{
	for(ll i=2;i*i<=x;++i)
	    if(x%i==0) return i;
	return -1;
}
ll pd2(ll x)
{
	ll z=pd1(x);
	x/=z;
	int y=pd1(x);
	if(y==-1) return -1;
	return z*y;
}
int main()
{
	cin>>n;
	if(ss(n))
	{cout<<1<<endl<<0<<endl;return 0;}
	z=pd2(n);
	if(z==-1)
	{cout<<2<<endl;return 0;}
	cout<<1<<endl;
	cout<<z<<endl;
	return 0;
}

上一篇:信安第二版:第12章网络安全审计技术原理与应用学习笔记


下一篇:KMP算法应用