形如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位。麥森數有許多重要應用,它與完全數密切相關。任務...