题目传送
I Older Brother
Your older brother is an amateur mathematician with lots of experience. However, his memory
is very bad. He recently got interested in linear algebra over finite fields, but he does not
remember exactly which finite fields exist. For you, this is an easy question: a finite field of
order q exists if and only if q is a prime power, that is, q = p^k holds for some prime number
p and some integer k >= 1. Furthermore, in that case the field is unique (up to isomorphism).
题意:判断一个数q能否等于p的k次方,要求p是素数,且k>=1;
思路:用到普通素数筛找到1至1e5(1e5的平方已经超过q的范围)的素数,每个素数不断累乘,直到乘积>=q。别忘了要判断q本身是不是素数
#include <iostream>
#include<cstring>
#include<stdlib.h>
#include<math.h>
#include<algorithm>
using namespace std;
int prime[10000010];//记录素数
int top;
bool is_prime[1000010];//标记i是不是素数
void ff()
{
int i,j;
for(i=2; i<=1000000; i++) is_prime[i]=true;//先都初始化为素数
is_prime[0]=is_prime[1]=false;
top=0;
for(i=2; i<=1000000; i++)
{
if(is_prime[i])
{
prime[++top]=i;
for(j=2*i; j<=1000000; j+=i)//i是素数,i的倍数不是素数
{
is_prime[j]=false;
}
}
}
}
int judge(long long z)
{
if(z==0||z==1)
return 0;
else if(z==2)
return 1;
else
{
int flag=1;
for(long long i=2;i<=sqrt(z);i++)
{
if(z%i==0)
{
flag=0;
break;
}
}
return flag;
}
}
int main()
{
long long q,i,sum;
ff();
cin>>q;
if(q==1)
cout<<"no"<<endl;
else
{
if(judge(q))//当q>1e5且q本身是素数时,在素数筛里找不到prime[i],会输出no
cout<<"yes"<<endl;
else
{
for(i=1; i<=top; i++)
{
sum=1;
while(sum<q)
{
sum*=prime[i];
}
if(sum==q)
break;
}
if(sum==q)
cout<<"yes"<<endl;
else
cout<<"no"<<endl;
}
}
return 0;
}