NEFU 梅森素数

来源:互联网 发布:细说php视频 百度云 编辑:程序博客网 时间:2024/04/27 18:43
点击打开链接

梅森素数

Time Limit 1000ms

Memory Limit 65536K

description

由于梅森学识渊博,才华横溢,为人热情以及最早系统而深入地研究2p-1 型的数(其中p为素数),为了纪念他,数学界就把这种数称为“梅森数”;并以Mp 记之(其中M为梅森姓名的首字母),即Mp=2p-1 。如果梅森数为素数,则称之为“梅森素数”。 比如p=2,3,5,7时,Mp 都是素数,但211-1 不是素数 。现在请你求出前N个梅森素数。

input

有多组测试数据。第一行是一个正整数T,表示测试数据的组数。接下来每组1个数p的值,这里2<= p <= 62。

output

对于每组测试数据,判断Mp 是不是梅森素数,是就输出“yes ”,否就输出“no”,输出后要换行。

sample_input

227

sample_output

yesyes

Lucas-Lehmer判定法则。
//684k1ms#include<stdio.h>long long data[66];long long multi(long long a,long long b,long long m)//a*b%m{    long long ret=0;    while(b>0)//乘法换成加法    {        if(b&1)ret=(ret+a)%m;        b>>=1;        a=(a<<1)%m;    }    return ret;}int main(){    long long sum,tmp;    int n,p;    data[1]=4;    scanf("%d",&n);    while(n--)    {        scanf("%d",&p);        sum=1;        sum<<=p;        sum-=1;        //printf("%lld\n",sum);        for(int i=2;i<=p-1;i++)        {            tmp=multi(data[i-1],data[i-1],sum);            data[i]=(tmp-2)%sum;        }        if(p==2)printf("yes\n");        else        {            if(data[p-1]==0)printf("yes\n");            else printf("no\n");        }    }    return 0;}


0 0