数学问题之(高精快速幂)

简介: 数学问题之(高精快速幂)

P1045 [NOIP2003 普及组] 麦森数

题目描述

形如 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复制

1279

输出 #1复制

386

00000000000000000000000000000000000000000000000000

00000000000000000000000000000000000000000000000000

00000000000000104079321946643990819252403273640855

38615262247266704805319112350403608059673360298012

23944173232418484242161395428100779138356624832346

49081399066056773207629241295093892203457731833496

61583550472959420547689811211693677147548478866962

50138443826029173234888531116082853841658502825560

46662248318909188018470682222031405210266984354887

32958028878050869736186900714720710555703168729087

说明/提示

【题目来源】

NOIP 2003 普及组第四题

1. //示例代码  C++语言
2. #include <bits/stdc++.h>
3. using namespace std;
4. const int N=500;
5. int a[N*2],res[N*2],t[N*2];
6. int p;
7. void mul(int* a,int* b,int* c){//高精a*b=c
8.  memset(t,0,sizeof(t));
9.  for(int i=0;i<N;i++)//计算后500位 即可
10.     for(int j=0;j<N;j++){
11.       t[i+j]+=a[i]*b[j];
12.       t[i+j+1]+=t[i+j]/10;
13.       t[i+j]%=10;
14.     }
15.   memcpy(c,t,sizeof(t));
16. }
17. void quickpow(int p){//快速幂
18.   res[0]=1;a[0]=2;
19.   while(p){
20.     if(p&1) mul(res,a,res);
21.     mul(a,a,a);
22.     p>>=1;
23.   }
24.   res[0]--;//个位修正
25. }
26. int main()
27. { 
28.   cin>>p;
29.   cout<<int(p*log10(2)+1)<<endl;//2^p结果位数计算公式
30.   quickpow(p);
31.   for(int k=499,i=0;i<10;i++){//逆向输出后500位 
32.     for(int j=0;j<50;j++){//每隔50位一个换行
33.       cout<<res[k];k--;
34.     }
35.     cout<<endl;
36.   }
37.   return 0;
38. }
1. # 示例代码  Python语言
2. import math
3. p =int(input())
4. s=p*math.log10(2)+1      # 套入计算公式计算z^p的位数
5. print(int(s))
6. r=pow(2,p,10**500)-1     # 2^p-1 取 后500位
7. r=str(r).rjust(500,'0')  # 500位右对齐 不足的补零
8. for i in range(10):
9. print(r[i*50:(i+1)*50]) # 字符串切片输出
相关文章
|
19天前
|
算法 测试技术 C++
【动态规划】【数学】【C++算法】18赛车
【动态规划】【数学】【C++算法】18赛车
|
19天前
|
Shell
【高数定积分求解旋转体体积】 —— (上)高等数学|定积分|柱壳法|学习技巧
【高数定积分求解旋转体体积】 —— (上)高等数学|定积分|柱壳法|学习技巧
58 0
|
存储 算法 大数据
基础算法-高精度加法
为什么要使用高精度算法 C++ 每一个变量都有自己的类型,每个类型都有自己的存储长度范围。
|
存储 算法 大数据
基础算法-高精度除法
高精度算法 为什么要使用高精度算法 C++ 每一个变量都有自己的类型,每个类型都有自己的存储长度范围。
|
存储 Java C语言
备战蓝桥杯【高精度加法和高精度减法】
备战蓝桥杯【高精度加法和高精度减法】
102 0
备战蓝桥杯【高精度加法和高精度减法】
|
机器学习/深度学习 算法
模拟退火-n皇后问题
模拟退火-n皇后问题
|
算法 C++
算法基础系列第四章——数论之从欧拉卷到欧几里得(1)
算法基础系列第四章——数论之从欧拉卷到欧几里得(1)
106 0
算法基础系列第四章——数论之从欧拉卷到欧几里得(1)
|
算法
数学:扩展欧几里得算法模板
扩展欧几里得算法
79 0
|
算法
数学:求欧拉函数算法模板
数学:求欧拉函数算法模板
75 0