We know that prime numbers are positive integers that have exactly two distinct positive divisors. Similarly, we'll call a positive integer t Т-prime, if t has exactly three distinct positive divisors.
You are given an array of n positive integers. For each of them determines whether it is Т-prime or not.
Input
The first line contains a single positive integer, n (1 ≤ n ≤ 105), showing how many numbers are in the array. The next line contains n space-separated integers xi (1 ≤ xi ≤ 1012).
Please, do not use the %lld specifier to read or write 64-bit integers in С++. It is advised to use the cin, cout streams or the %I64d specifier.
Output
Print n lines: the i-th line should contain "YES" (without the quotes), if number xi is Т-prime, and "NO" (without the quotes), if it isn't.
Let's say we have a n, we want to know n is T-prime or not, what can we do?
T-prime requires 1 divisor and does not count 1 and number itself. The only possible answer is the square of the number and this square should be a prime number.
How to prove if the square is a prime number, this number would not have other divisors?
Let's say a * b = c. we assume a <= b.
a and b can be divided into many prime divisors.
If we reduce the value of a, which a divided by a prime divisor, and b multiplied by this value, it would increase b, but c's value would not change because of the transferable features.
if a = sqrt(c) and b = sqrt(c), the maximum value for a is sqrt(c) and the minimum value for b is sqrt(c).
if sqrt(c) is a prime number, then there is no room to reduce a and no room to increase b, which means, you cannot find other combinations of divisors that can form c.
#include<iostream>
#include<vector>
#include<cmath>
#include<set>
using namespace std;
typedef long long ll;
set<ll> pme;
bool isprime(ll n){
if(pme.count(n) != 0)return true;
if(n == 1)return false;
for(int i = 2; i * i <= n; i++){
if(n % i == 0)return false;
}
pme.insert(n);
return true;
}
int main(){
int n;
cin >> n;
for(int i = 1; i <= n; i++){
ll rr;
cin >> rr;
ll x = sqrt(rr);
if(x * x == rr && isprime(x)){
cout << "YES" << endl;
}
else cout << "NO" << endl;
}
return 0;
}