CF230B. T-primes (Number Theory)

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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值