赞
踩
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;
- }
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。