您的位置:首页 > 其它

noip2003 麦森数 (数论,高精乘单精)

2015-08-29 14:31 323 查看
A1146. 麦森数

时间限制:1.0s   内存限制:256.0MB  
总提交次数:883  
AC次数:218   平均分:41.60

将本题分享到:

      
   

查看未格式化的试题   提交   试题讨论

试题来源

  NOIP2003 普及组

问题描述

  形如2P-1的素数称为麦森数,这时P一定也是个素数。但反过来不一定,即如果P是个素数,2P-1不一定也是素数。到1998年底,人们已找到了37个麦森数。最大的一个是P=3021377,它有909526位。麦森数有许多重要应用,它与完全数密切相关。

  任务:从文件中输入P(1000<P<3100000),计算2P-1的位数和最后500位数字(用十进制高精度数表示)

输入格式

  文件中只包含一个整数P(1000<P<3100000)

输出格式

  第一行:十进制高精度数2P-1的位数。

  第2-11行:十进制高精度数2P-1的最后500位数字。(每行输出50位,共输出10行,不足500位时高位补0)

  不必验证2P-1与P是否为素数。

样例输入

1279

样例输出

386

00000000000000000000000000000000000000000000000000

00000000000000000000000000000000000000000000000000

00000000000000104079321946643990819252403273640855

38615262247266704805319112350403608059673360298012

23944173232418484242161395428100779138356624832346

49081399066056773207629241295093892203457731833496

61583550472959420547689811211693677147548478866962

50138443826029173234888531116082853841658502825560

46662248318909188018470682222031405210266984354887

32958028878050869736186900714720710555703168729087

代码:

#include<cstdio>
#include<cmath>
#include<algorithm>
#define maxn 100
#define len 100000
using namespace std;
int p,a[maxn+10],b[11];

void multiply(int x)
{
int i,j,k,last=0;
k=min(a[0],maxn);
for(i=1;i<=k;i++)
{
a[i]=a[i]*x+last;
last=a[i]/len;
a[i]%=len;
}
if(last>0 && a[0]<maxn)a[++a[0]]=last;
}
void work()
{
int i,j,k;
scanf("%d",&p);
k=int(log10(2)*p)+1;
printf("%d",k);

a[0]=1,a[1]=1;
for(b[0]=i=1;i<=10;i++)b[i]=b[i-1]<<1;
while(p>=10)multiply(b[10]),p-=10;
if(p>0)multiply(b[p]);
a[1]-=1;

for(i=maxn;i>=1;i--)
{
if(i%10==0)printf("\n");
printf("%05d",a[i]);
}
printf("\n");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: