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

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

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]) # 字符串切片输出
相关文章
|
人工智能 算法
算法提高:组合数学| 容斥原理常见应用
容斥原理常见的问题如下。 (1) 篮球、羽毛球、网球三种运动,至少会一种的有22人,会篮球的有15人,会羽毛球的有17人,会网球的有12人,既会篮球又会羽毛球的有11人,既会羽毛球又会网球的有7人,既会篮球又会网球的有9人,那么三种运动都会的有多少人? (2) 《西游记》《三国演义》《红楼梦》三大名著,至少读过其中一本的有20人,读过《西游记》的有10人,读过《三国演义》的有12人,读过《红楼梦》的有15人,读过《西游记》《三国演义》的有8人,读过《三国演义》《红楼梦》的有9人,读过《西游记》《红楼梦》的有7人。问三本书全都读过的有多少人?
150 0
算法提高:组合数学| 容斥原理常见应用
|
6月前
|
算法 测试技术 C++
【动态规划】【数学】【C++算法】18赛车
【动态规划】【数学】【C++算法】18赛车
|
6月前
|
Shell
【高数定积分求解旋转体体积】 —— (上)高等数学|定积分|柱壳法|学习技巧
【高数定积分求解旋转体体积】 —— (上)高等数学|定积分|柱壳法|学习技巧
111 0
|
机器学习/深度学习 人工智能
数学问题之(矩阵快速幂)
数学问题之(矩阵快速幂)
|
存储 算法 大数据
基础算法-高精度除法
高精度算法 为什么要使用高精度算法 C++ 每一个变量都有自己的类型,每个类型都有自己的存储长度范围。
|
存储 Java C语言
备战蓝桥杯【高精度加法和高精度减法】
备战蓝桥杯【高精度加法和高精度减法】
122 0
备战蓝桥杯【高精度加法和高精度减法】
|
人工智能
Codeforces1491——C.Pekora and Trampoline(差分思维+树状数组)
Codeforces1491——C.Pekora and Trampoline(差分思维+树状数组)
105 0
Codeforces1491——C.Pekora and Trampoline(差分思维+树状数组)
|
算法
数学:扩展欧几里得算法模板
扩展欧几里得算法
97 0
|
算法
数学:求欧拉函数算法模板
数学:求欧拉函数算法模板
100 0