T-primes

Time Limit: 1sec    Memory Limit:256MB
Description

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 determine whether it is Т-prime or not.

Input

The first line contains a single positive integer, n (1 ≤ n ≤ 10000),showing how many numbers are in the array. 

The next line contains n space-separated integers xi (1 ≤ xi ≤ 10^12).

Output

Print one line: The number of T-primes number

Sample Input
 Copy sample input to clipboard
3
4 5 6
Sample Output
1
Hint

Please use long long instead of int for any Xi.

The given test has three numbers. 

The first number 4 has exactly three divisors — 1, 2 and 4. 

The second number 5 has two divisors (1 and 5), 

The third number 6 has four divisors (1, 2, 3, 6),

hence the answer for them is 1 (only the number 4 is T-primes number).

 

 

Problem Source: OYoung






  题解:此题的意思是判断输入的数字是否有且仅有3个因数(positive divisors),并记录满足条件的输入的个数。而我们不难发现,能满足条件的数字 N 的3个因数必然是: 1、√N 、N ,且 √N 要是整数。 这个题解条件不难解决,我们只需判断:pow([sqrt(N)],2) 是否等于 N就可以了。

然而问题又出现了,输入的数据有10^12之大,对输入的N进行循环判断必然会超时(Time Limit Exceeded)。 因此我们不得不换个思路解决问题,我们要求满足条件的输入 N,对应的 √N 是整数。换句话说就是输入的数只能是自然数的平方形式( 即:4,9,16,25,36,49……),同时 √N 需要是素数(如4,9,25,49对应的2,3,5,7都是素数,而16,36对应的4,6不是素数),否则就会多于3个因数。(因为4*4=2*8 ,而7*7 != a*b )。

最后就是一个小坑,要记得排除1,1并不是T-prime数。(本宝宝就被坑了)




本宝宝的码


06. #include<iostream>
07. #include<iomanip>
08. #include<cmath>
09. using namespace std;
10.  
11. int main()
12. {
13. int a[101],book[1001]={0};
14. int N;
15. cin >>N;
16. int max=0;
17. for(int i=0;i<N;i++){
18. cin >>a[i];
19. book[a[i]]++;
20. if(book[a[i]]>max){
21. max=book[a[i]];
22. }
23. }
24. if(N==1){
25. cout <<"YES"<<endl;
26. }
27. else{
28. if(N%2 != 0){
29. if(max <= N/2+1){
30. cout <<"YES" <<endl;
31. }
32. else{
33. cout <<"NO" <<endl;
34. }
35. }
36. else{
37. if(max <= N/2){
38. cout <<"YES" <<endl;
39. }
40. else{
41. cout <<"NO" <<endl;
42. }
43. }
44. }
45. return 0;
46. }

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值