列举一下可能出现的几种情况:
-
$ q $ 是一个质数或者 $ q = 1 $ ,开始就无法操作,玩家一必胜,直接在第一行输出 1 ,第二行输出 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;
}