I Older Brother

题目传送
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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值