DIV. 2 B — T-PRIMES

http://www.yyycode.cn/index.php/2020/05/23/div-2-b-t-primes/


 

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 ≤ 105), showing how many numbers are in the array. The next line contains n space-separated integers x i (1 ≤ x i ≤ 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 x i is Т-prime, and “NO” (without the quotes), if it isn’t.ExamplesinputCopy

3
4 5 6

outputCopy

YES
NO
NO

Note

The given test has three numbers. The first number 4 has exactly three divisors — 1, 2 and 4, thus the answer for this number is “YES”. The second number 5 has two divisors (1 and 5), and the third number 6 has four divisors (1, 2, 3, 6), hence the answer for them is “NO”.


题意:求一个数是不是只有3个因子.一个数肯定被1和自己整除。所以如果有一个比sqrt(n)小的数可以是因子,必然有一个>sqrt(n)的因子,是成对出现的。那我们看1-sqrt(n)是不是都是素数,如果不都是素数,那必然有因子成对出现。于是就判断1-sqrt(n)有无素数。

不知道为什么T63..

#include<iostream>
#include<vector>
#include<queue>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1e5+10;
typedef long long LL;
LL a[maxn];
int main(void)
{
	cin.tie(nullptr);std::ios::sync_with_stdio(false);
	LL n;cin>>n;
	LL k;
	for(LL i=1;i<=n;i++)
	{
		LL flag=1;
		cin>>k;
		x的范围是1e12,这个复杂度是sqrt(n)的 ,转化 
		LL c=sqrt(k);
		if(c*c!=k||k==1) 
		{
			cout<<"NO\n";continue;
		}

		for(LL j=2;j<=c/j;j++)
		{	
			if(c%j==0)
				{
					flag=0;cout<<"NO\n";break;
 				}		
		}
		if(flag) cout<<"YES\n";
	}
return 0;
}

这么写就不T了..

两个优化:

第一个优化:

一个是if(c*c>=k&&k!=1&&prime(c)),这里面有短路运算, 把能快速确定整个表达式结果true或false的表达式放在前面,这样由于短路运算后面的表达式可能不会被运算到,节省处理器的运算时间。

第二个优化:

LL t=sqrt(n);
for(LL i=2;i<=t;i++)
先把这个t拿出来….平时都是i<=n/i去算的,不懂..

#include<iostream>
#include<vector>
#include<queue>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1e5+10;
typedef long long LL;
bool prime(LL n)
{
	LL t=sqrt(n);
	for(LL i=2;i<=t;i++)
	{
		if(n%i==0)
		 return 0;
	}
return 1;	
}

int main(void)
{
	cin.tie(nullptr);std::ios::sync_with_stdio(false);
	LL n;
	LL k;
	cin>>n;
	for(LL i=1;i<=n;i++)
	{
		cin>>k;
		x的范围是1e12,这个复杂度是sqrt(n)的 ,转化 
		LL c=sqrt(k);
		if(c*c>=k&&k!=1&&prime(c))
		{
			cout<<"YES\n";
		}
		else cout<<"NO\n";
	}
return 0;
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值