首页 > 学院 > 开发设计 > 正文

1005麦森数

2019-11-06 08:19:27
字体:
来源:转载
供稿:网友

Description

形如2P-1的素数称为麦森数,这时P一定也是个素数。但反过来不一定,即如果P是个素数,2P-1不一定也是素数。到1998年底,人们已找到了37个麦森数。最大的一个是P=3021377,它有909526位。麦森数有许多重要应用,它与完全数密切相关。任务:输入P(1000<P<3100000),计算2P-1的位数和最后500位数字(用十进制高精度数表示)。

Input

一个整数P(1000<P<3100000)。

Output

第一行:十进制高精度数2P-1的位数;第2-11行:十进制高精度数2P-1的最后500位数字(每行输出50位,共输出10行,不足500位时高位补0);不必验证2P-1与P是否为素数。

Sample Input 

1279

Sample Output 

38600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010407932194664399081925240327364085538615262247266704805319112350403608059673360298012239441732324184842421613954281007791383566248323464908139906605677320762924129509389220345773183349661583550472959420547689811211693677147548478866962501384438260291732348885311160828538416585028255604666224831890918801847068222203140521026698435488732958028878050869736186900714720710555703168729087

分析:数值为n的数的位数为log10(n)+1,所以2^p-1的位数为p*(log10(2))+1,另外其求出其前五百位的值,因为p的数值较大,所以采用分治的算法来求2^p,2^p = 2^(p/2)*2(p/2)*f(p),p%2==0,f(p)=0;p%2==1,f(p)=2。由此求得2^p。

参考代码:

#include<cstdio>#include<cmath>#include<cstdlib>#include<cstring>#include<string>#include<algorithm>#include<stack>#include<queue>#include<vector>#include<map>#include<iostream>using namespace std;typedef long long ll;const int maxn = 520;int p;int digit;int num[maxn];int tmp[maxn*2];void solve( int n){    if( n == 0)        return;    solve(n/2);    for( int i = 1; i <= 500; i++)    {        for( int j = 1; j <= 500; j++)        {            if( n%2 == 0)                tmp[i+j-1] += num[i]*num[j];            else                tmp[i+j-1] += num[i]*num[j]*2;        }    }    for( int i = 1; i <= 500; i++)    {        num[i] = tmp[i]%10;        tmp[i+1] += tmp[i]/10;    }    memset(tmp,0,sizeof(tmp));}int main(){    while( ~scanf("%d",&p) && p)    {        digit = (int)(p*log10(2))+1;        memset(num,0,sizeof(num));        memset(tmp,0,sizeof(tmp));        PRintf("%d/n",digit);        num[1] = 1;        solve(p);        for( int i = 500; i >= 2; i--)        {            printf("%d",num[i]);            if( i%50 == 1)                putchar(10);        }        printf("%d/n",num[1]-1);    }    return 0;}

Sample Input 
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表