关于我两个样例都过了只AC#1......
查看原帖
关于我两个样例都过了只AC#1......
1127560
SR_G_B_ysqd1602楼主2024/8/14 19:01
#include<bits/stdc++.h>
using namespace std;
#define int unsigned long long
long long q;
const int n=1e7+1;
int check[n],prime[n/3],top,gs,cc[114514],ans=1;
void ola(int m){
	for(int i=2;i<=m;i++){
		if(!check[i])prime[++top]=i;
		for(int j=1;j<=top&&prime[j]*i<=m;j++){
			check[i*prime[j]]=prime[j];
			if(i%prime[j]==0)break;
		}
	}
}
signed main(){
	cin>>q;
	ola(n);//1e7+1>=sqrt(q) 
	long long p=q;
	for(int i=1;i<=top&&p!=1;i++){
		while(p%prime[i]==0&&p!=prime[i]){
			p/=prime[i];
			cc[++gs]=prime[i];//顺序存入 
			if(gs<=2)ans*=cc[gs];//留两个质因子就等于留一次操作 
		}
	}
	if(p>1)cc[++gs]=p;//操作结束后不等于1是质数,且其小于原数说明是合数 ,加进去 
	if(gs==2){
		printf("2\n");//一次可以用一个大合数除掉,只剩下两个质因子时后出手方胜 ,类似拿火柴拿到最后一根就输 
	}else{
		if(gs>1){
			printf("1\n%lld\n",cc[1]*cc[2]);//贪心,只留两个而且最小 
		}else printf("1\n0\n");//第一次就写不出来要特判 
	}
	return 0;
} 
2024/8/14 19:01
加载中...