首页 > 其他分享 >P1045 [NOIP2003 普及组] 麦森数极简解法解读

P1045 [NOIP2003 普及组] 麦森数极简解法解读

时间:2024-08-17 20:28:47浏览次数:15  
标签:极简 麦森数 int NOIP2003 long 60 位数 500 10

源代码如下 (这个精妙绝伦的算法不是我发现的,而是取自原题解中的某个大佬,在经过一顿学习正常题解后看到,顿觉豁然开朗,原贴:https://www.luogu.com.cn/article/c3u874kg

include

include

include

using namespace std;
long long a[501]={1};
int main()
{
int p;
cin>>p;
cout<<(int)(plog10(2))+1<<endl;
for(;p>0;p-=60)
{
long long f=0;
for(int i=0;i<500;i++)
{
if(p>60)a[i]<<=60;
else a[i]<<=p;
a[i]+=f;
f=a[i]/10;
a[i]%=10;
}
}
a[0]--;
for(int i=499;i>=0;i--)
{
putchar(a[i]+'0');
if(i%50==0)putchar('\n');
}
return 0;
}
此题不能纯模拟,会爆内存,对于题目要求的求最后500位数进行单独求解,而位数可以直接通过公式计算得出:(p
log10(2))+1
解释:10k有k+1位,而k=lg(10k)。所以2p的位数是lg(2p)+1=p*lg(2)
正常的解法是用高精快速幂求解,但是本体的主体中使用一个十分精简的算法:
下面解决500位求值的问题:这里还是开一个a[501]的long long数组,然后还是用每个元素表示1位数,没错,是1位数,这样时间够而且代码简单。每次乘一轮不要乘2,乘2^60(9乘以2的60次方刚好不会溢出),记得把p多减掉59就行了。
关于主体的解释:
for(;p>0;p-=60)
{
long long f=0;
for(int i=0;i<500;i++)
{
if(p>60)a[i]<<=60;
else a[i]<<=p;
a[i]+=f;
f=a[i]/10;
a[i]%=10;
}
}
可以简单看做仅计算前500位的纯模拟60次的快速运算,其他次数也可以
f就是纯模拟中的进位,只不过这里也是一次计算了60次
<<= n 是指将数转化为二进制后整体向左移n位后赋值,在正常的纯模拟中也可以使用,而且似乎十分方便。
纯模拟500位的运算是否会爆内存,经过计算复杂度为10的10次方,超过上限并不多,所以这个算法其实是一个运算性能换时间的方法,如果数字继续加大,这个方法可能并不适用,这里用这个算法的原因是十分精妙而且有使用价值,顺便也复习了<<=的用法,用来一次运算多次幂十分可行。

标签:极简,麦森数,int,NOIP2003,long,60,位数,500,10
From: https://www.cnblogs.com/kaltists/p/18364916

相关文章

  • Linux打包命令tar极简示例_2
    只解压tar包中的某个文件这是tar包:只解压a.txt:上边的例子不大理想,再来一个tar包里带目录的:再弄个gzip压缩过的吧:......
  • C++趣味实验之:设计一个模拟公司运营的程序(极简版)
    根据剩余价值理论,设计一个模拟公司运营的程序原理非常简单: (此公式为企业扩大再生产的基本规律)同理,我们可以利用C++来实现这个操作,这就需要使用递归函数doublen,c,sum1,d1,z1;cout<<"输入启动资金(万元):"<<endl;cin>>n;intb;cout<<"输入市场劳动力数目:"<<endl;ci......
  • 简简单单,扫雷小游戏(极简版)
    目录前言一、扫雷要求二、准备工作1.建立文件2.游戏思路三、扫雷游戏代码步骤1:建立主函数步骤2:创建数组并初始化步骤3:打印数组步骤4:布置雷步骤5:排查雷步骤6:补全头文件四、完整代码 后言:前言用VS2022写的扫雷小游戏,超详细,一步一步帮你理透.一、......
  • Typora v1.9.5解锁版下载、安装教程 (一款好用极简的Markdown编辑器)
    前言Typora是一款由AbnerLee开发的轻量级Markdown编辑器,与其他Markdown编辑器不同的是,Typora没有采用源代码和预览双栏显示的方式,而是采用所见即所得的编辑方式,实现了即时预览的功能,但也可切换至源代码编辑模式。一、下载地址下载链接:分享文件:Typora-v1.9.5-x64......
  • LLM大模型实战:从零到精通——大模型应用开发极简入门
    大家好,今天给大家推荐一本大模型应用开发入门书籍《大模型应用开发极简入门》,本书对很多AI概念做了讲解和说明!朋友们如果有需要《大模型应用开发极简入门》,扫码获取~本书主要讲解了以下几个方面的大模型技术:GPT-4和ChatGPT的工作原理:书中详细介绍了这两个先进的语言......
  • Nginx最简学习网站——Nginx 极简教程
    教程地址https://dunwu.github.io/nginx-tutorial/#/nginx-quickstart以配置静态站点为例worker_processes1;events{worker_connections1024;}http{includemime.types;default_typeapplication/octet-stream;sendfileon;......
  • Spring 状态机极简使用
    Spring状态机极简使用本文不探讨状态机的思想与Spring状态机的架构,仅做快速实现参考。Spring状态机官方文档项目参考代码基于SpringBoot配置的快速集成案例maven依赖配置<dependency><groupId>org.springframework.statemachine</groupId><artifactId>spring-s......
  • 洛谷P1042 [NOIP2003 普及组] 乒乓球
    题目链接:-P1042[NOIP2003普及组]乒乓球[NOIP2003普及组]乒乓球题目背景国际乒联现在主席沙拉拉自从上任以来就立志于推行一系列改革,以推动乒乓球运动在全球的普及。其中11分制改革引起了很大的争议,有一部分球员因为无法适应新规则只能选择退役。华华就是其中一位,他退役......
  • [极简码文]只需一行代码,超绝完成26个日常任务!
    本文特别为Python初学者设计,旨在展示Python如何以一行代码解决常见的编程任务,让你体验Python的极简美学。通过这些实例,你不仅能够学习到Python的基础知识,还能掌握一些高效编码的小技巧。1.计算列表平均值解释:使用sum()计算列表总和,len()获取长度,然后相除得到平均值。nu......
  • 极简AI工具箱完整上线啦!
    图片转word|极简AI工具箱:可识别图片内容,并转换为保留原文档版式的Word文档,方便二次编辑和复制图片转ecxel|极简AI工具箱:可识别图片内容,并转换为保留原文档版式的Excel文档,方便二次编辑和复制人像分割/证件照换底色|极简AI工具箱:将人像和背景进行分割,背景完全透明化......