题目描述
经过zlh不懈的努力终于找了一个女朋友,他每天都和他女朋友视频聊天,今天晚上他和他女朋友约好了玩
真心话大冒险,他想他知道他女朋友说的真真心话是不是真的,他是这么判断的,根据llm定理,一个人说话的时时间
如果是素数,那么就是真话,否则就是假话。现在请你榜zlh判断他女朋友说的是否是真话。
输入
第一行输入一个t(1<=t<=1e9),
每行输入一个数n(2<=n<=1000000),表示这一轮zlh女朋友的发言时间是多少。
输出
每一轮如果zlh女朋友发言时间是素数输出YES。
否则输出NO。
样例输入
10
2
3
4
5
6
7
8
9
10
11
样例输出
YES
YES
NO
YES
NO
YES
NO
NO
NO
YES
分析:先用埃氏筛法筛出1e6之内的素数,考虑到时间问题,之后查找素数时用二分查找即可,不知道是不是OJ的问题,如果筛1e6的素数提交上去会显示内存超限,不过改成筛1e5的素数就通过了。
#include<stdio.h>
const int M=1e5+5;
int a[M],b[M],c[M],n,m,i,j,k;
bool Binary_search(int num)
{
int l=1,r=n,mid;
while(l<=r)
{
mid=(l+r)/2;
if(b[mid]==num)
{
return true;
}
else if(b[mid]<num)
{
l=mid+1;
}
else if(b[mid]>num)
{
r=mid-1;
}
}
return false;
}
int main()
{
for(i=2;i<M;i++)
{
if(a[i]==0)
{
for(j=2*i;j<M;j=j+i)
{
a[j]=1;
}
}
}
for(i=2;i<M;i++)
{
if(a[i]==0)
{
b[++n]=i;
}
}
scanf("%d",&m);
for(i=1;i<=m;i++)
{
scanf("%d",&c[i]);
}
for(i=1;i<=m;i++)
{
if(Binary_search(c[i])==true)
printf("YES\n");
else
printf("NO\n");
}
}
后来发现自己这样的话慢了,我们直接利用筛法将素数标记就可以了,感谢acm队友lys的指导!!!
#include<stdio.h>
const int M=1e6+5;
bool a[M];
int n,i,j,k,num;
int main()
{
for(i=2;i<=M;i++)
{
if(a[i]==0)
for(j=i+i;j<=M;j=j+i)
{
a[j]=1;
}
}
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&num);
if(a[num]==1)
printf("NO\n");
else
printf("YES\n");
}
}