问题 5116 --麦森数-NOIP2003PJT4

5116: 麦森数-NOIP2003PJT4

时间限制: 1 Sec  内存限制: 128 MB
提交: 87  解决: 25
[提交][状态][讨论版][数据上传:][下载FPS1元][下载测试数据1元][84kb]

题目描述

麦森数

(mason.pas/c/pp)

题目描述

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

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

输入格式

文件中只包含一个整数P1000<P<3100000

输出

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

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

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

样例输入

1279

样例输出

386
00000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000
00000000000000104079321946643990819252403273640855
38615262247266704805319112350403608059673360298012
23944173232418484242161395428100779138356624832346
49081399066056773207629241295093892203457731833496
61583550472959420547689811211693677147548478866962
50138443826029173234888531116082853841658502825560
46662248318909188018470682222031405210266984354887
32958028878050869736186900714720710555703168729087

输入

输出

提示



l第一问是很简单的,只需要求一个对数而已,数学原理:十进制正整数n的位数为int(log10(n))+1。所以2^P-1的位数int(log10(2)^p)+1 = int(p*log10(2))+1 。


l即int(p*(ln2/ln10))+1


l本题的解题方法很多,其中分治也是一种巧妙的方法。首先可以想到:


  2n=(2 n div 2)2*2 (n mod 2) ,即:如果要计算2n,就要先算出2 n div 2,然后用高精度乘法算它的平方,如果n是奇数还要再乘以2,写成递归公式就是:f(n)=(f(n div 2))2*2(n mod 2)


当然,递归是要有边界值的,这就是当n=0时,f(n)=1。还要补充一点,该数的长度是可以用公式计算的,所以在做高精度乘法时,只要取最后500位运算就行了。








来源

[提交][状态]