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是否为素数。

输入输出样例

输入样例

1279

输出样例

386
00000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000
00000000000000104079321946643990819252403273640855
38615262247266704805319112350403608059673360298012
23944173232418484242161395428100779138356624832346
49081399066056773207629241295093892203457731833496
61583550472959420547689811211693677147548478866962
50138443826029173234888531116082853841658502825560
46662248318909188018470682222031405210266984354887
32958028878050869736186900714720710555703168729087

解析

这道题可以分为两个模块,第一个模块为求的位数,第二个模块为求的后500位(不足补零)。我们主要来解决第一个模块:

一、求位数

首先我们知道2^{p}-12^{p}有着相同的位数,因为2的次方满足了最后一位不为零的要求,所以减一后位数并不会改变,那么我们可以直接求2^{p}的位数。那么怎么求位数呢?我们不妨设k=2^{p},根据10^{n}的位数为n+1,我们只要想办法把k=2^{p}中的底数2改为10,指数加一就是位数了。由此想到用10的几次方来代替2,那么就不难想到10^{log_{10}2}=2,这样便可以把k=2^{p}中的2代换掉,变为k=\left ( 10^{log_{10}2} \right )^{p}.根据乘方的原理,将p乘进去,原式便可化为我们最终想要的形式k=10^{log_{10}2\ast p}

 了,所以位数就是log_{10}2\ast p+1(C++中cmath库自带log10()函数)

二、求最后500位数

根据快速幂的模板加上高精度乘法就可以直接解决。

代码

#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
int p,f[1001],res[1001],sav[1001];
void result1(){memset(sav,0,sizeof(sav));for(int i=1;i<=500;i++){for(int j=1;j<=500;j++){sav[i+j-1]+=res[i]*f[j];//sav[]数组作为一个中间变量 }}for(int i=1;i<=500;i++){sav[i+1]+=sav[i]/10;sav[i]%=10;}memcpy(res,sav,sizeof(res));//把sav中的值赋给res中 
}
void result2(){memset(sav,0,sizeof(sav));for(int i=1;i<=500;i++){for(int j=1;j<=500;j++){sav[i+j-1]+=f[i]*f[j];//f自乘 }}for(int i=1;i<=500;i++){sav[i+1]+=sav[i]/10;sav[i]%=10;}memcpy(f,sav,sizeof(f));//把sav中的值赋给f中 
}
int main(){cin>>p;cout<<(int)(log10(2)*p+1)<<endl;res[1]=1;//存储最终的答案 f[1]=2;//存储快速幂中的base while(p!=0){//快速幂模板 if(p%2==1){result1();}p/=2;result2();}res[1]-=1;//最终的结果求得是2^p-1 for(int i=500;i>=1;i--){if(i!=500&&i%50==0){cout<<endl;cout<<res[i];}else{cout<<res[i];}}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/434739.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[网鼎杯 2018]Fakebook1

join一个用户后&#xff0c;点进去发现是这样的 查看这个页面的源代码&#xff0c;发现一个base64编码后的字串 decode之后就是我们join新用户时填入的blog网址 那我们是不是可以通过填入存储flag的地址&#xff0c;从而回显出来呢&#xff1f;当然&#xff0c;先按照常规sqli…

python学习20

前言&#xff1a;相信看到这篇文章的小伙伴都或多或少有一些编程基础&#xff0c;懂得一些linux的基本命令了吧&#xff0c;本篇文章将带领大家服务器如何部署一个使用django框架开发的一个网站进行云服务器端的部署。 文章使用到的的工具 Python&#xff1a;一种编程语言&…

flask_apscheduler源码分析

前言 遵循flask框架的标准的库&#xff0c;称为flask扩展&#xff0c;flask_apscheduler模块就是一个flask扩展&#xff0c;它使用了flask编程上下文&#xff0c;同时内部完全依赖apscheduler。 我近期使用flask_apscheduler遇到了一个所有job全部死亡的bug。现象&#xff1a;j…

【Linux工具篇】Linux项目自动化构建工具make/Makefile

目录 背景 make/makefile怎样完成项目 完成原理 依赖关系 依赖方法 项目清理 执行顺序 Q1&#xff1a;makefile对最新可执行程序不会默认重新生成 Q2&#xff1a;Q1是怎样做到的 规范的makefile 背景 会不会写makefile&#xff0c;从一个侧面说明了一个人是否具备完成…

搜狐新闻客户端使用Kotlin之后对JSON解析框架的探索

本文字数&#xff1a;7488字 预计阅读时间&#xff1a;45分钟 01 引言 自2017年Google发布Kotlin语言之后&#xff0c;Android开发由原来的Java开始向Kotlin过度&#xff0c;目前绝大部分Android开发岗位基本要求就是熟练使用Kotlin。事实上&#xff0c;很多有着多年历史的项目…

Qt使用中文字符串乱码的问题

文章目录 vs编译器下第一种解决方式第二种解决方式 Qt编译器下 我们在使用qt的时候有时候会遇到打印中文字符串的时候出现中文乱码的问题&#xff0c;主要是由于Qt的QString字符串存储的方式是使用utf-8的编码方式&#xff0c;如果我们本地的文件是使用GBK方式的编码再使用中文…

osgEarth真HelloWorld

osgEarth真HelloWorld vcpkg installtests vcpkg install osgEarth安装指南 https://docs.osgearth.org/en/latest/install.html&#xff0c; 预先设置ports/osg/portfile.cmake GL3 否则调用osg相关功能时会出现如下提示 OpenSceneGraph does not define OSG_GL3_AVAILABLE; …

Factor Transfer(NeurIPS 2018)

paper&#xff1a;Paraphrasing Complex Network: Network Compression via Factor Transfer official implementation&#xff1a;https://github.com/Jangho-Kim/Factor-Transfer-pytorch 背景 尽管现有的知识蒸馏方法如KD、FitNet等带来了性能的改善&#xff0c;但直接传…

element plus使用问题

文章目录 element plusvue.config.js注意1、有时候会报错 not a function2、使用 ElMessage 报错3、 element plus 版本过高4、警告Feature flag VUE_PROD_HYDRATION_MISMATCH_DETAILS is not explicitly defined.5、报错 ResizeObserver loop completed with undelivered noti…

如何监控两台android设备之间串口通讯的ADB日志?

如果你的目标是将设备通过 Wi-Fi 连接到计算机&#xff0c;可以执行以下步骤&#xff1a; 一.通过 USB 连接设备&#xff1a; adb devices 确保设备通过 USB 连接&#xff0c;并且可以通过 adb devices 命令正常识别。 二、将设备1和设备2都切换到 TCP/IP 模式&#xff1a;…

汇编led驱动的代码编写以及ubuntu下的烧录

文章目录 前言一、实验代码详解二、编译1、arm-linux-gnueabihf-gcc 编译文件2、arm-linux-gnueabihf-ld 链接文件3、arm-linux-gnueabihf-objcopy 格式转换4、arm-linux-gnueabihf-objdump 反汇编5、编写Makefile文件 三、代码烧写1、将 imxdownload 拷贝到工程根目录下2、给予…

幻兽帕鲁服务器多少钱一台?腾讯云新版报价

腾讯云幻兽帕鲁服务器4核16G、8核32G和16核64G配置可选&#xff0c;4核16G14M带宽66元一个月、277元3个月&#xff0c;8核32G22M配置115元1个月、345元3个月&#xff0c;16核64G35M配置580元年1个月、1740元3个月、6960元一年&#xff0c;腾讯云百科txybk.com分享腾讯云幻兽帕鲁…