当前位置:   article > 正文

CF230B. T-primes (Number Theory)_我们知道质数是只有两个不同的正数因数的正整数。相似的我们把一个正整数t叫做t质数

我们知道质数是只有两个不同的正数因数的正整数。相似的我们把一个正整数t叫做t质数

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. 

  1. #include<iostream>
  2. #include<vector>
  3. #include<cmath>
  4. #include<set>
  5. using namespace std;
  6. typedef long long ll;
  7. set<ll> pme;
  8. bool isprime(ll n){
  9. if(pme.count(n) != 0)return true;
  10. if(n == 1)return false;
  11. for(int i = 2; i * i <= n; i++){
  12. if(n % i == 0)return false;
  13. }
  14. pme.insert(n);
  15. return true;
  16. }
  17. int main(){
  18. int n;
  19. cin >> n;
  20. for(int i = 1; i <= n; i++){
  21. ll rr;
  22. cin >> rr;
  23. ll x = sqrt(rr);
  24. if(x * x == rr && isprime(x)){
  25. cout << "YES" << endl;
  26. }
  27. else cout << "NO" << endl;
  28. }
  29. return 0;
  30. }

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/75137
推荐阅读
相关标签
  

闽ICP备14008679号