(File IO): input:num.in output:num.out
时间限制: 1000 ms 空间限制: 262144 KB 具体限制
Goto ProblemSet
题目描述
K
C
KC
KC邀请他的两个小弟
K
K
K和
C
C
C玩起了数字游戏。游戏是
K
K
K和
C
C
C轮流操作进行的,
K
K
K为先手。
K
C
KC
KC会先给定一个数字
Q
Q
Q,每次操作玩家必须写出当前数字的一个因数来代替当前数字,但是这个因数不能是
1
1
1和它本身。例如当前数字为
6
6
6,那么可以用
2
,
3
2,3
2,3来代替,但是
1
1
1和
6
6
6就不行。现在规定第一个没有数字可以写出的玩家为胜者。
K
K
K在已知
Q
Q
Q的情况,想知道自己作为先手能不能胜利,若能胜利,那么第一次写出的可以制胜的最小数字是多少呢?整个游戏过程我们认为
K
K
K和
C
C
C用的都是最优策略。
输入
只包括一个正整数
Q
Q
Q
输出
第一行是
1
1
1或
2
,
1
2,1
2,1表示K能胜利,
2
2
2表示
C
C
C能胜利。
若K能胜利,则在第二行输出第一次写出的可以制胜的最小数字,若是第一次就无法写出数字,则认为第一次写出的可以制胜的最小数字为
0
0
0。
说明:若
C
C
C能胜利,不用输出第二行,输出
2
2
2即可。
样例输入
6
样例输出
2
数据范围限制
对于
30
30%
30的数据,
Q
<
=
50
Q<=50
Q<=50; 对于
100
100%
100的数据,
Q
<
=
1
0
1
3
Q<=10^13
Q<=1013。
解题思路
思路:数学
求出
q
q
q的质因数的个数
这道题分为三种情况:
1:
n
n
n为质数,
k
k
k赢,第一次写出
0
0
0。(第一次就没有可以输出的)。
2:
n
n
n为两个质数的乘积(两个质数可以相等),
c
c
c赢。
3:
n
n
n很复杂,则输出
n
n
n最小的两个质因数(可以相等,即
n
=
k
∗
t
∗
t
n=k*t*t
n=k∗t∗t,
t
t
t为此质因数)的积。
代码
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<iomanip>
#include<cmath>
using namespace std;
long long q,a[100000],k,n;
int main(){
freopen("num.in","r",stdin);
freopen("num.out","w",stdout);
scanf("%lld",&q);
k=0;
n=q;
for(long long i=2;i*i<=n;i++)
{
while(q%i==0)
{
a[++k]=i;
q/=i;
}
}
if(q!=1)
a[++k]=q;
if(k==1)
printf("1\n0\n");
else
if(k==2)
printf("2\n");
else
{
printf("1\n");
printf("%lld\n",a[1]*a[2]);
}
return 0;
}