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