洛谷P1045 麥森數

2021-08-16 17:41:18 字數 1704 閱讀 9332

形如2^-12p

−1的素數稱為麥森數,這時p

p 一定也是個素數。但反過來不一定,即如果p

p 是個素數,2^-12p

−1不一定也是素數。到2023年底,人們已找到了37個麥森數。最大的乙個是p=3021377p=

3021

377 ,它有909526位。麥森數有許多重要應用,它與完全數密切相關。

任務:從檔案中輸入p

p (100010

00<

p<31

0000

0 ),計算2^-12p

−1的位數和最後500位數字(用十進位制高精度數表示)

輸入格式:

檔案中只包含乙個整數p

p (100010

00<

p<31

0000

0 )輸出格式:

第一行:十進位制高精度數2^-12p

−1的位數。

第2-11行:十進位制高精度數2^-12p

−1的最後500位數字。(每行輸出50位,共輸出10行,不足500位時高位補0)

不必驗證

2^-12p

−1與p

p 是否為素數。

弱雞寫的50分裸的高精度

剛開始還想能不能每次乘16(2^4),然後再乘(p%4)個2,試了試,果然還是5個tle

#include#include#include#includeusing namespace std;

int ans[909527] = ;

int p;

void highmulity(int k) }}

void minusone()

else

}}void print()

}int main()

for (int i = 0; i < left; i++)

minusone();

print();

return 0;

}

正確解法:

快速冪+高精度

有乙個公式能夠直接計算2^p-1的位數:log10(2)*p+1

快速冪詳解見下面第乙個鏈結(強烈建議先看第乙個鏈結,因為我直接看第二個鏈結沒懂,看了第乙個才知道陣列代表著什麼)

然後高精度的做法就是前500位模擬豎式

這是一篇講快速冪很好的文章

我把題解鏈結中的高精度乘法的函式模組化了,題解中用到了乙個memcpy函式,但當我傳入引數時不管用,所以我只能迴圈遍歷複製陣列。不信的話你可以看看題解中的高精度乘法函式。

#include#include#include#include#include#include#includeusing namespace std;

int ans[1001];//答案

int a[1001];

int tmp[1001];//乘法的話陣列開2倍

void highmulity(int *a,int *b)

void print()

}int main()

p /= 2;

highmulity(a,a);

} ans[1] -= 1;

print();

return 0;

}

洛谷P1045麥森數

題幹很簡單,就是要求2的p次方 1的位數和後500位。首先我們肯定不會去把這個數算出來,不然鐵t,那怎麼算位數呢?於是我們想一想數學方法因為2的p次方個位數必不為0,所以2的p次方 1的位數和2的p次方位數相同。又有10的n次方是n 1位數所以轉化一下2的p次方就是10的log10 2 p 1位數,...

洛谷 P1045 麥森數

不會快速冪的我只能瘋狂壓位 dalao們請無視 這是本蒟蒻滴第一篇洛谷題解還請多多包涵鴨!好吧先看看我的辛路歷程 剛看到這題的時候,我第一反應是壓位,於是我從未壓位到 5壓到 10,吸氧後發現後兩者都是60分 o o 於是乎我將2p次方轉化為1024n m,以及220n m來運算,結果只有70分 最...

洛谷 P1045 麥森數 題解

洛谷 p1045 形如 2 p pp 1 的素數稱為麥森數,這時p一定也是個素數。但反過來不一定,即如果p pp是個素數,2 p pp 1不一定也是素數。到1998年底,人們已找到了37個麥森數。最大的乙個是p pp 3021377,它有909526位。麥森數有許多重要應用,它與完全數密切相關。任務...