数学专项number_theory:LA 4079

来源:互联网 发布:汤不热同类软件 编辑:程序博客网 时间:2024/05/22 00:23

学过复变函数的都知道,复数可以由模乘上辐角来表示。所以不难得出当a*a+2*b*b为素数时,该数为高斯素数。但是还得考虑a或b为0的情况,这里我用了枚举的方法,若a或b能表示为x*x+2*y*y的形式且为为素数时,该数也为高斯素数。

#include <iostream>#include <cstdio>#include <cmath>#include <algorithm>using namespace std;int isprime(int x){    int m=sqrt(x*1.0);    for(int i=2;i<=m;i++) if(x%i==0) return 0;    return 1;}int judge(int x){    int m=sqrt(x*1.0);    for(int i=0;i<=m;i++)    {        double t=sqrt((x-i*i*1.0)/2.0);        if(ceil(t)==floor(t)) return 1;    }    return 0;}int main(){    int T;    cin>>T;    while(T--)    {        int a,b;        cin>>a>>b;        if(abs(a)<=1&&b==0) {cout<<"No"<<endl;continue;}        if(a==0)        {            if(isprime(abs(b))&&!judge(abs(b))) cout<<"Yes"<<endl;            else cout<<"No"<<endl;            continue;        }        if(b==0)        {            if(isprime(abs(a))&&!judge(abs(a))) cout<<"Yes"<<endl;            else cout<<"No"<<endl;            continue;        }        int t=a*a+2*b*b;        if(!isprime(t)) cout<<"No"<<endl;        else cout<<"Yes"<<endl;    }    return 0;}


原创粉丝点击