90pts求调, WA sub1 #10
查看原帖
90pts求调, WA sub1 #10
551894
lemon2021楼主2024/8/14 16:41
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int MAXN = 5010;
int len;
bool is_prime[MAXN];
int prime[MAXN];
int num[MAXN];
int p[MAXN];
void Linear_sieve(){ //ÏßÐÔɸ 
	for(int i = 2; i < MAXN; i++){
		is_prime[i] = true;
	}
	for(int i = 2; i < MAXN; i++){
		if(is_prime[i]){
			len++;
			prime[len] = p[i] = i;
		}
		for(int j = 1; j <= len && i * prime[j] < MAXN; j++){
			p[i * prime[j]] = max(p[i], prime[j]);
			is_prime[i * prime[j]] = false;
			if(i % prime[j] == 0){
				break;
			}
		}
	}
}
int split(int x){
	for(int i = 1; i <= len; i++){
		while(x % prime[i] == 0){
			x /= prime[i];
			num[i]++;
		}
		if(x < prime[i]){
			break;
		}
	}
	return x;
}
signed main(){
//	freopen("split.in", "r", stdin);
//	freopen("split.out", "w", stdout);
	Linear_sieve();
	int T;
	scanf("%lld", &T);
	while(T--){
		int a;
		bool flag = true;
		scanf("%lld", &a);
		for(int i = 1; i <= len; i++){
			num[i] = 0;
		}
		int t = split(a);
		for(int i = 1; i <= len; i++){
			if(num[i] == 1){
				flag = false;
			}
		}
		if(t != 1){
			int _2 = sqrt(t);
			int _3 = cbrt(t);
			if(_2 * _2 != t && _3 * _3 * _3 != t){
				flag = false;
			}
		}
		if(flag){
			printf("yes\n");
		}
		else{
			printf("no\n");
		}
	}
	return 0;
}
2024/8/14 16:41
加载中...