(纪中)2155. num【数学】

119 篇文章 0 订阅

(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=ktt 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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值