P1045 [NOIP2003 普及组] 麦森数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

想法很简单,我们要做的就是两件事,求2^P-1的位数,求出2^P-1的最后500位数,也就是低五百位,500位想一想常规类型肯定存不下,int到10^9,long long 到10^18,于是只能用高精度乘法来算阶乘

  1. 第一步,可以不用通过求出所有2^P-1的数然后记录位数来得出其位数,给出几个例子

1000为四位数,位数=lg1000+1=3+1=4,同理对于5486,位数=int(lg5486)+1=4,所以对于一个数,只需要求他对10的对数值加上1就是其位数,对于这次的2^P-1,可以知道其尾数必为2的倍数,(0除外),因此2^P-1的位数即2^P的位数 

于是其位数=int(lg(2^P))+1=int(P*lg2)+1,这样看来只需要调用cmath头文件里的lg10函数求出lg2就可以直接得出位数

2. 第二步,求出其后500位, 这里应用高精度乘法,但是由于只需要求500位,高于500位的数字其实并不用去关注,直接丢掉即可

const int MAX = 500;
typedef long long LL;//不用long long会爆掉的
void Big_Mul(LL* ans, LL* Base)
{
LL C[MAX] = { 0 };
for (int i = 0; i < MAX; i++)
{
for (int j = 0; j < MAX; j++)
{
if(i+j<MAX)//高于500位直接舍弃
C[i + j] += ans[i] * Base[j];
}
}
//下面是逐个位进位处理
//方便起见我们不设置进制位,而是让后一位数加上前一位数的进位值,然后前一位数舍弃其进位值来实现逐位进位
for (int i = 0; i <MAX-1; i++)
{
C[i + 1] = C[i + 1] + C[i]/10;
C[i] %= 10;//舍弃进位值
}
C[MAX - 1] %= 10;//舍弃最大为的进位值,因为只需要后五百位,多的位数不需要
for (int i = 0; i < MAX; i++)
ans[i] = C[i];//拷贝
}

只有高精度乘法,然后朴素乘方的话会TLE的,因此还要配合快速幂来加速

下面给出完整代码

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
const int MAX = 500;
typedef long long LL;
void Big_Mul(LL* ans, LL* Base)
{
LL C[MAX] = { 0 };
for (int i = 0; i < MAX; i++)
{
for (int j = 0; j < MAX; j++)
{
if(i+j<MAX)
C[i + j] += ans[i] * Base[j];
}
}
for (int i = 0; i <MAX-1; i++)
{
C[i + 1] = C[i + 1] + C[i]/10;
C[i] %= 10;
}
C[MAX - 1] %= 10;
for (int i = 0; i < MAX; i++)
ans[i] = C[i];
}
int main()
{
int p;
cin >> p;
cout << int(log10(2.0) * p +1)<< endl;//求出位数并输出
LL ans[MAX] = { 0 };
LL Base[MAX] = { 0 };//高精度数组初始化
ans[0] = 1;//结果存储
Base[0] = 2;//基数也就是底数
while (p)//快速幂
{
if (p & 1)
Big_Mul(ans, Base);
Big_Mul(Base, Base);//可以看到就是将快速幂里的乘法变为了高精度乘法
p >>= 1;
}
ans[0]--;//求出2^P-1
for (int i = 499; i >= 0; i--)//逆序输出500位
{
cout << ans[i];
if(i%50==0)//每50位换行
cout << endl;
}
return 0;
}

洛谷P1045 麦森数。 快速幂算法以及固定位数的高精度乘法的优化的更多相关文章

  1. 洛谷 P1045 麦森数

    题目描述 形如2^{P}-1的素数称为麦森数,这时P一定也是个素数.但反过来不一定,即如果P是个素数,2^{P}-1不一定也是素数.到1998年底,人们已找到了37个麦森数.最大的一个是P=30213 ...

  2. 洛谷P1045 麦森数

    题目描述 形如2^{P}-12 ​P ​​ −1的素数称为麦森数,这时PP一定也是个素数.但反过来不一定,即如果PP是个素数,2^{P}-12 ​P ​​ −1不一定也是素数.到1998年底,人们已找 ...

  3. NOIP2003 普及组 洛谷P1045 麦森数 (快速幂+高精度)

    有两个问题:求位数和求后500位的数. 求位数:最后减去1对答案的位数是不影响的,就是求2p的位数,直接有公式log10(2)*p+1; 求后500位的数:容易想到快速幂和高精度: 1 #includ ...

  4. 洛谷 P1045 麦森数 (快速幂+高精度+算位数骚操作)

    这道题太精彩了! 我一开始想直接一波暴力算,然后叫上去只有50分,50分超时 然后我改成万位制提高运算效率,还是只有50分 然后我丧心病狂开long long用10的10次方作为一位,也就是100亿进 ...

  5. P1045麦森数

    P1045麦森数 #include<iostream> #include <cmath> #include <cstring> const int maxn = 1 ...

  6. 洛谷 P1226 【模板】快速幂||取余运算

    题目链接 https://www.luogu.org/problemnew/show/P1226 题目描述 输入b,p,k的值,求b^p mod k的值.其中b,p,k*k为长整型数. 输入输出格式 ...

  7. 洛谷试炼场-简单数学问题-P1045 麦森数-高精度快速幂

    洛谷试炼场-简单数学问题 B--P1045 麦森数 Description 形如2^P−1的素数称为麦森数,这时P一定也是个素数.但反过来不一定,即如果PP是个素数,2^P-1 不一定也是素数.到19 ...

  8. 【题解】[P1045] 麦森数

    题目 题目描述 形如2^P-1的素数称为麦森数,这时P一定也是个素数.但反过来不一定,即如果P是个素数,2^P-1 不一定也是素数.到1998年底,人们已找到了37个麦森数.最大的一个是P=30213 ...

  9. 洛谷P1226 【模板】快速幂||取余运算

    题目描述 输入b,p,k的值,求b^p mod k的值.其中b,p,k*k为长整型数. 输入输出格式 输入格式: 三个整数b,p,k. 输出格式: 输出“b^p mod k=s” s为运算结果 S1: ...

  10. 洛谷P1313 计算系数【快速幂+dp】

    P1313 计算系数 题目描述 给定一个多项式(by+ax)^k,请求出多项式展开后x^n*y^m 项的系数. 输入输出格式 输入格式: 输入文件名为factor.in. 共一行,包含5 个整数,分别 ...

随机推荐

  1. SCA技术进阶系列(一):SBOM应用实践初探

    现代软件都是组装的而非纯自研.随着开源组件在数字化应用中的使用比例越来越高,混源开发已成为当前业内主流开发方式.开源组件的引入虽然加快了软件开发效率,但同时将开源安全问题引入了整个软件供应链.软件组成 ...

  2. java实现mysqlplus查询一个月之间的数据

    先说需求使用mysqlplus查询一个月之内的数据,传入的参数是202108 要求就查8月份这个月的所有数据,oracle数据中数据记录的时间类型是Date类型 public static void ...

  3. 三、java连接mongo数据库

    系列导航 一.linux单机版mongo安装(带密码验证) 二.mongo集群搭建 三.java连接mongo数据库 四.java对mongo数据库增删改查操作 五.mongo备份篇 mongoexp ...

  4. freeswitch设置最大呼叫时长

    概述 freeswitch 作为开源VOIP软交换,对经过fs的每一通电话都要有足够的控制. 在一通电话呼叫中,通话时长是一个重要的数据,客户在实际使用过程中,会有各种针对呼叫时长的场景需求. 本篇文 ...

  5. Idea 进行远程服务器debug操作

    本文为博主原创,转载请注明出处: 很多时候为了定位服务器的问题,不方便定位时,采用idea 远程debug 服务器环境的服务进行问题定位,主要操作步骤如下: 1. 修改服务器服务的JVM 配置,开启远 ...

  6. Skywalking 搭建 nacos 注册中心及mysql 存储的集群架构

    本文为博主原创,未经允许不得转载 Skywalking 集群是将skywalking oap作为一个服务注册到nacos上,只要skywalking oap服务没有全部宕机,保证有一个skywalki ...

  7. SD协议-时序02

    SD Bus PAD internal card clock - 对于SD card来讲,时钟信号是一个输入 Data0-3 - inout类型,既可能是输入,又可能是输出 对于Data0-3输出的时 ...

  8. 如何让你的.NET WebAPI程序支持HTTP3?

    下面我将总结构建Http3的经验,以Token Gateway的项目为例,请注意使用Http3之前你需要知道它的限制, Windows Windows 11 版本 22000 或更高版本/Window ...

  9. [粘贴]TiFlash

    TiFlash 是 TiDB HTAP 形态的关键组件,它是 TiKV 的列存扩展,在提供了良好的隔离性的同时,也兼顾了强一致性.列存副本通过 Raft Learner 协议异步复制,但是在读取的时候 ...

  10. [转帖]开源软件项目中BSD、MIT许可证合规问题探析

    https://www.allbrightlaw.com/CN/10475/3be2369275d19e9e.aspx   [摘要]本文将探析BSD开源许可证(Berkeley Software Di ...