洛谷P1045 麦森数。 快速幂算法以及固定位数的高精度乘法的优化
P1045 [NOIP2003 普及组] 麦森数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

想法很简单,我们要做的就是两件事,求2^P-1的位数,求出2^P-1的最后500位数,也就是低五百位,500位想一想常规类型肯定存不下,int到10^9,long long 到10^18,于是只能用高精度乘法来算阶乘
- 第一步,可以不用通过求出所有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 麦森数。 快速幂算法以及固定位数的高精度乘法的优化的更多相关文章
- 洛谷 P1045 麦森数
题目描述 形如2^{P}-1的素数称为麦森数,这时P一定也是个素数.但反过来不一定,即如果P是个素数,2^{P}-1不一定也是素数.到1998年底,人们已找到了37个麦森数.最大的一个是P=30213 ...
- 洛谷P1045 麦森数
题目描述 形如2^{P}-12 P −1的素数称为麦森数,这时PP一定也是个素数.但反过来不一定,即如果PP是个素数,2^{P}-12 P −1不一定也是素数.到1998年底,人们已找 ...
- NOIP2003 普及组 洛谷P1045 麦森数 (快速幂+高精度)
有两个问题:求位数和求后500位的数. 求位数:最后减去1对答案的位数是不影响的,就是求2p的位数,直接有公式log10(2)*p+1; 求后500位的数:容易想到快速幂和高精度: 1 #includ ...
- 洛谷 P1045 麦森数 (快速幂+高精度+算位数骚操作)
这道题太精彩了! 我一开始想直接一波暴力算,然后叫上去只有50分,50分超时 然后我改成万位制提高运算效率,还是只有50分 然后我丧心病狂开long long用10的10次方作为一位,也就是100亿进 ...
- P1045麦森数
P1045麦森数 #include<iostream> #include <cmath> #include <cstring> const int maxn = 1 ...
- 洛谷 P1226 【模板】快速幂||取余运算
题目链接 https://www.luogu.org/problemnew/show/P1226 题目描述 输入b,p,k的值,求b^p mod k的值.其中b,p,k*k为长整型数. 输入输出格式 ...
- 洛谷试炼场-简单数学问题-P1045 麦森数-高精度快速幂
洛谷试炼场-简单数学问题 B--P1045 麦森数 Description 形如2^P−1的素数称为麦森数,这时P一定也是个素数.但反过来不一定,即如果PP是个素数,2^P-1 不一定也是素数.到19 ...
- 【题解】[P1045] 麦森数
题目 题目描述 形如2^P-1的素数称为麦森数,这时P一定也是个素数.但反过来不一定,即如果P是个素数,2^P-1 不一定也是素数.到1998年底,人们已找到了37个麦森数.最大的一个是P=30213 ...
- 洛谷P1226 【模板】快速幂||取余运算
题目描述 输入b,p,k的值,求b^p mod k的值.其中b,p,k*k为长整型数. 输入输出格式 输入格式: 三个整数b,p,k. 输出格式: 输出“b^p mod k=s” s为运算结果 S1: ...
- 洛谷P1313 计算系数【快速幂+dp】
P1313 计算系数 题目描述 给定一个多项式(by+ax)^k,请求出多项式展开后x^n*y^m 项的系数. 输入输出格式 输入格式: 输入文件名为factor.in. 共一行,包含5 个整数,分别 ...
随机推荐
- [QML]从零开始QML开发(二)QML开发,浅谈控件、槽函数、锚等基本概念。QML和C++怎么交互?贯彻落实MVC原则
[QML]从零开始QML开发(二)QML开发,浅谈控件.槽函数.锚等基本概念.QML和C++怎么交互?贯彻落实MVC原则 先看代码: import QtQuick 2.12 import QtQuic ...
- P4913【黄】
这题好像可以用线段树什么的高级做法来做,但我感觉我这个简单做法不管是时间还是空间都和那些复杂的做法差不了太多.重点是很优雅,思路非常简单,而且代码很短,用OOP思想写成的代码可读性极高,不用注释估计都 ...
- 线段树的区间更新 hdu 1698
***第一次写的果断超时,所以百度了一下,知道我写的每一次都要递归最底层,这样会花费很多时间,第二次写得线段树的区间更新,因为一个条件写错了,真是让我坑到死, 这样区间相同的不必更新,省了很多时间.. ...
- 打 multi-fidelity RL 旗号,但是幼稚监督学习 + 迁移学习
文章名称:Multi-fidelity reinforcement learning framework for shape optimization 链接:https://www.sciencedi ...
- C++数据结构(树)
树是一种递归定义的数据结构,如果树中节点的各子树从左到右是有次序的,不能互换,则称该树为有序树,否则叫无序树. 关于树的节点: 节点拥有的子树的个数叫做节点的度 如果度为0,那么该节点叫做叶节点或终端 ...
- 如何使用 Helm 在 K8s 上集成 Prometheus 和 Grafana|Part 3
在本教程的前两部分,我们分别了解和学习了Prometheus 和 Grafana 的基本概念和使用的前提条件,以及使用 Helm 在 Kubernetes 上安装 Prometheus. 在今天的教程 ...
- 06-逻辑仿真工具VCS-Debug
逻辑仿真工具VCS verdi只进行debug进行使用,不进行编译,只进行产生波形之后的debug 仿真速度和代码质量有关系,选项也会影响仿真速度,行为级>RTL>门级 信号的可见性和可追 ...
- PS去除PDF中的WPS 编辑试用水印
1. 问题 自己的学习资料.pdf被添加上了相关水印,导致阅读起来很不舒服 2. 解决方式(适用于白底黑字的pdf资料,去除水印) 2.1 初始图片如下: 2.2 打开PS,选择菜单栏中选择一项中的色 ...
- Oracle官网下载软件需要登录Oracle账户问题
问题描述 当我们在Oracle官网上下载JDK时,(JDK下载地址)系统会提示需要登录Oracle账户.对于没有Oracle账户的人来说,注册账户太繁琐. 没有账户怎么办??? 此处推荐一个靠谱的网站 ...
- [SpringMVC] - 解决Jackson中文乱码 : springmvc-servlet.xml
<!-- 指定响应体返回类型和编码 , 解决乱码????的问题 --> <mvc:annotation-driven> <mvc:message-converters r ...