標籤:
P1223麥森數Accepted標籤:NOIP普及組2003[顯示標籤]描述
形如2^P-1的素數稱為麥森數,這時P一定也是個素數。但反過來不一定,即如果P是個素數,2^P-1不一定也是素數。到1998年底,人們已找到了37個麥森數。最大的一個是P=3021377,它有909526位。麥森數有許多重要應用,它與完全數密切相關。
任務:從檔案中輸入P(1000<P<3100000),計算2^P-1的位元和最後500位元字(用十進位高精度數表示)
格式輸入格式
檔案中只包含一個整數P(1000<P<3100000)
輸出格式
第一行:十進位高精度數2^P-1的位元。
第2-11行:十進位高精度數2^P-1的最後500位元字。(每行輸出50位,共輸出10行,不足500位時高位補0)
不必驗證2^P-1與P是否為素數。
範例1範例輸入1[複製]
1279
範例輸出1[複製]
38600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010407932194664399081925240327364085538615262247266704805319112350403608059673360298012239441732324184842421613954281007791383566248323464908139906605677320762924129509389220345773183349661583550472959420547689811211693677147548478866962501384438260291732348885311160828538416585028255604666224831890918801847068222203140521026698435488732958028878050869736186900714720710555703168729087
限制
各個測試點1s
提示
十分簡單,別想複雜了!^_^
這道題目,要用的只是點就一個,高精度乘法運算,如果是C++的話,請用分治的方法,而對於java以及python而言,只需要直接調用對於高精度計算的函數即可,此處用了python的pow
計算位元很簡單,10^x + k = 2^p -1 -> log10(2^p - k - 1) == x - > int (log10(2) * p) + 1
python代碼:
#!/usr/bin/env python3# -*- coding: utf-8 -*-import mathimport sysP = int(raw_input())print int(math.log10(2) * P) + 1L = pow(2,P) - 1L = L % pow(10,500)#將數字減少,否則後面的取餘運算的時間會增大,導致逾時f = []for i in range(500): f.append(L % 10) L /= 10for i in range(500 - 1, -1, -1): sys.stdout.write('%d' % f[i]) if i % 50 == 0: print ''
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
vijos - P1223麥森數 (高精度乘法 + 分治 + python)