【题解】【高精度】—— [NOIP2003 普及组] 麦森数

news2024/9/22 5:28:45

【题解】【高精度】—— [NOIP2003 普及组] 麦森数

  • [NOIP2003 普及组] 麦森数
    • 题目描述
    • 输入格式
    • 输出格式
    • 输入输出样例
      • 输入 #1
      • 输出 #1
    • 提示
  • 1.题意解析
    • 1.1.求位数
    • 1.2.输出最后500位
      • 1.2.1.输出
      • 1.2.2.高精度乘法
      • 1.2.3.快速幂
  • 2.AC代码

[NOIP2003 普及组] 麦森数

题目描述

形如 2 P − 1 2^{P}-1 2P1 的素数称为麦森数,这时 P P P 一定也是个素数。但反过来不一定,即如果 P P P 是个素数, 2 P − 1 2^{P}-1 2P1 不一定也是素数。到 1998 年底,人们已找到了 37 个麦森数。最大的一个是 P = 3021377 P=3021377 P=3021377,它有 909526 位。麦森数有许多重要应用,它与完全数密切相关。

任务:输入 P ( 1000 < P < 3100000 ) P(1000<P<3100000) P(1000<P<3100000),计算 2 P − 1 2^{P}-1 2P1 的位数和最后 500 500 500 位数字(用十进制高精度数表示)

输入格式

文件中只包含一个整数 P ( 1000 < P < 3100000 ) P(1000<P<3100000) P(1000<P<3100000)

输出格式

第一行:十进制高精度数 2 P − 1 2^{P}-1 2P1 的位数。

2 ∼ 11 2\sim 11 211 行:十进制高精度数 2 P − 1 2^{P}-1 2P1 的最后 500 500 500 位数字。(每行输出 50 50 50 位,共输出 10 10 10 行,不足 500 500 500 位时高位补 0 0 0

不必验证 2 P − 1 2^{P}-1 2P1 P P P 是否为素数。

输入输出样例

输入 #1

1279

输出 #1

386
00000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000
00000000000000104079321946643990819252403273640855
38615262247266704805319112350403608059673360298012
23944173232418484242161395428100779138356624832346
49081399066056773207629241295093892203457731833496
61583550472959420547689811211693677147548478866962
50138443826029173234888531116082853841658502825560
46662248318909188018470682222031405210266984354887
32958028878050869736186900714720710555703168729087

提示

【题目来源】

NOIP 2003 普及组第四题

1.题意解析

    我们把这道题分成两个模块。一个是求位数,另一个是输出最后500位。

1.1.求位数

    我们知道,一个数 1 0 k > n > 1 0 k − 1 10^k>n>10^{k-1} 10k>n>10k1,那么它的位数就是 k k k

    又因为 2 p 2^p 2p 的最后一位数永远不可能是0,不可能-1之后退位导致位数减少。所以我们将求 2 p − 1 2^p-1 2p1 的位数转换成求 2 p 2^p 2p 的位数。

接下来我们设 2 p 的位数 = k 2^p的位数=k 2p的位数=k,则有 1 0 k > 2 p > 1 0 k − 1 10^k>2^p>10^{k-1} 10k>2p>10k1

将不等式变个形 k > l o g 10 ( 2 p ) > k − 1 k>log_{10}(2^p)>k-1 k>log10(2p)>k1

l o g x ( n ) log_x(n) logx(n) 表示 x k = n x^k=n xk=n中的 k k k,不理解可以自己上网去了解一下对数相关知识。

再根据对数的运算法则,可以得出 k > p × l o g 10 ( 2 ) > k − 1 k>p\times log_{10}(2)>k-1 k>p×log10(2)>k1
那么 p × l o g 10 ( 2 ) p\times log_{10}(2) p×log10(2)向下取整就等于 k − 1 k-1 k1。所以int(p*log10(2)+1)就是最终的答案。

1.2.输出最后500位

    接下来就要用到高精度了。还是老样子,使用我在高精度算法解析和高精度赛场用模板分装的bigint结构体。不过有两个地方要稍微改一下。

1.2.1.输出

    这里由于只要求输出最后的500位。所以我们可以从1~500遍历输出。每输出50个数,即i%50==0就输出一个换行。

friend void print(bigint x)//输出,和普通的输出高精度整数略有不同 
{
	for(int i=1;i<=500;i++)//这里只输出最后500位
	{
		cout<<x[501-i];//500-i+1的化简
		if(i%50==0)cout<<endl;//每输出50位就输出一个换行 
	}
}

1.2.2.高精度乘法

这里只需要计算最后500位。展开时也最多展开500+500位。改进后的代码如下:

friend bigint operator*(bigint a,bigint b)//乘法,这里只计算最后500位 
{
	bigint c;
	int lena=a.len,lenb=b.len;
	for(int i=1;i<=min(lena,500);i++)//最多计算500位 
		for(int j=1;j<=min(lenb,500);j++)//同理 
		    c[i+j-1]+=a[i]*b[j];
	c.flatten(min(lena+lenb,1000));//最多展开500+500位 
	return c;
}

1.2.3.快速幂

    对于计算 2 p 2^p 2p,我们可以使用快速幂。这里直接给出快速幂模版。如果还不知道快速幂,可以去洛谷P1226 【模板】快速幂练练手。

bigint qpow(bigint a,int p)//快速幂
{
	if(p==1)return a;
	if(p%2==0)return qpow(a*a,p/2);
	return a*qpow(a,p-1);
}

2.AC代码

#include<bits/stdc++.h>
using namespace std;
struct bigint
{
	int a[1010],len;
	bigint(int x=0)
	{
		memset(a,0,sizeof(a));
		if(x==0)
		{
			len=1;
			return;
		}
		for(len=1;x;len++)
		    a[len]=x%10,x/=10;
		len--;
	}
	void flatten(int L)
	{
		len=L;
		for(int i=1;i<=len;i++)
		{
			a[i+1]+=a[i]/10;
			a[i]%=10;
		}
		while(!a[len])
		    len--;
	}
	int &operator[](int i)
	{
		return a[i];
	}
	friend void print(bigint x)//输出,和普通的输出高精度整数略有不同 
	{
		for(int i=1;i<=500;i++)//这里只输出最后500位
		{
			cout<<x[501-i];//500-i+1的化简
		    if(i%50==0)cout<<endl;//每输出50位就输出一个换行 
		}
	}
    //这里无需重载+
	friend bigint operator*(bigint a,bigint b)//乘法,这里只计算最后500位 
	{
		bigint c;
		int lena=a.len,lenb=b.len;
		for(int i=1;i<=min(lena,500);i++)//最多计算500位 
		    for(int j=1;j<=min(lenb,500);j++)//同理 
		        c[i+j-1]+=a[i]*b[j];
		c.flatten(min(lena+lenb,1000));//最多展开500+500位 
		return c;
	}
};
bigint qpow(bigint a,int p)//快速幂 
{
	if(p==1)return a;
	if(p%2==0)return qpow(a*a,p/2);
	return a*qpow(a,p-1);
}
int main()
{
    int p;
    bigint a;
    cin>>p;
    cout<<int(p*log10(2)+1)<<endl;//输出位数
    a=qpow(2,p);a[1]--;//计算2^p-1
    print(a);//输出 
	return 0;
}

喜欢就订阅此专辑吧!

【蓝胖子编程教育简介】
蓝胖子编程教育,是一家面向青少年的编程教育平台。平台为全国青少年提供最专业的编程教育服务,包括提供最新最详细的编程相关资讯、最专业的竞赛指导、最合理的课程规划等。本平台利用趣味性和互动性强的教学方式,旨在激发孩子们对编程的兴趣,培养他们的逻辑思维能力和创造力,让孩子们在轻松愉快的氛围中掌握编程知识,为未来科技人才的培养奠定坚实基础。

欢迎扫码关注蓝胖子编程教育
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

(一)C++学习笔记(满满的都是水货咕噜!)

1、基本概念 1 – 什么是C c就是c语言的扩展&#xff0c;完全兼容c语言 c语言在c语言的基础上添加了面向对象编程和泛型编程的支持。c继承了c语言高效&#xff0c;简洁&#xff0c;快速和可移植的传统。 c融合了3种不同的编程方式: c语言代表的过程性语言. c在c语言基础上添加…

爬虫 Web Js 逆向:RPC 远程调用获取加密参数(2)使用 JsRPC 框架

RPC (Remote Procedure Call) 是远程调用的意思。 在 Js 逆向时&#xff0c;本地可以和浏览器以服务端和客户端的形式通过 WebSocket 协议进行 RPC 通信&#xff0c;这样可以直接调用浏览器中的一些函数方法&#xff0c;不必去在意函数具体的执行逻辑&#xff0c;可以省去大量的…

苹果macOS 15 Sequoia投屏功能 实现Mac上iPhone桌面管理

8月14日消息&#xff0c;苹果最新的 iOS 18 和 macOS 15 Sequoia 测试版为 iPhone 投屏功能带来了重大更新。用户可以直接在 Mac 上管理 iPhone 桌面。 iPhone 镜像功能 macOS Sequoia最大的更新是带来了iPhone 镜像功能&#xff0c;这个功能能让给 Mac 用户将 iPhone 的屏幕镜…

免费版音频格式转换器哪个好用?6大热门工具对比

在数字音频领域&#xff0c;音频格式转换已成为日常生活和工作中必不可少的一部分。无论是为了适配不同的设备&#xff0c;还是为了压缩音频文件以节省存储空间&#xff0c;音频格式转换器都能为我们提供极大的便利。市面上有众多免费版音频格式转换器&#xff0c;但哪些工具真…

【向量数据库】Ubuntu编译安装FAISS

参考官方的安装指导&#xff1a;https://github.com/facebookresearch/faiss/blob/main/INSTALL.md&#xff0c;不需要安装的可以跳过 ~$ wget https://github.com/facebookresearch/faiss/archive/refs/tags/v1.8.0.tar.gz ~$ tar -zxvf v1.8.0.tar.gz ~$ cd faiss-1.8.0 ~$ …

舵机模块学习

舵机是一种根据输入PWM信号占空比来控制输出角度的装置 执行逻辑&#xff1a;PWM信号输入到控制板&#xff0c;给控制版一个指定的目标角度&#xff0c;然后电位器检测输出轴的当前角度&#xff0c;如果大于目标角度&#xff0c;电机反转&#xff0c;小于正转&#xff0c;最终使…

Yearning开源SQL审核平台本地Linux系统部署与远程登录语句审核

文章目录 前言1. Linux 部署Yearning2. 本地访问Yearning3. Linux 安装cpolar4. 配置Yearning公网访问地址5. 公网远程访问Yearning管理界面6. 固定Yearning公网地址 前言 本文主要介绍在 Linux 系统简单部署 Yearning 并结合 cpolar 内网穿透工具实现远程访问&#xff0c;破除…

【Datawhale AI夏令营第四期】 魔搭-大模型应用开发方向笔记 Task01 DeepSeek简易AI助手

【Datawhale AI夏令营第四期】 魔搭-大模型应用开发方向 Task01 正处于拿毕业证求职和实习离职期间的过渡期&#xff0c;想着闲着也是闲着&#xff0c;索性拉上本科同学队友报名参加AI比赛&#xff0c;想方设法卷个项目经验出来。 Task1的任务主要是体验从0开始搭建一个AI对…

联想季度收入强劲增长,全球PC市场回暖

联想季度收入显著增长 2024年8月14日&#xff0c;北京——中国科技巨头联想集团公布了其第一季度财报&#xff0c;收入同比增长20%&#xff0c;达到了154亿美元。这一增幅超过了LSEG调查分析师预期的141亿美元。这一财报标志着联想在经历了连续五个季度的收入下滑后&#xff0…

seata的使用(SpringBoot项目整合seata)

文章目录 1、解压 seata-server-1.7.1.zip2、启动 双击 seata-server.bat3、启动 seata 控制台用户界面4、所有分布式事务相关数据库要有undo-log5、项目引入seata依赖6、项目添加seata配置7、代码实现&#xff1a; 1、解压 seata-server-1.7.1.zip 2、启动 双击 seata-server.…

基于springboot在线课程管理系统的设计与实现

TOC springboot236基于springboot在线课程管理系统的设计与实现 绪论 1.1 选题背景 目前整个社会发展的速度&#xff0c;严重依赖于互联网&#xff0c;如果没有了互联网的存在&#xff0c;市场可能会一蹶不振&#xff0c;严重影响经济的发展水平&#xff0c;影响人们的生活…

上万张看图背单词图片英语图片#看图猜单词#

看图背英语类的数据没有搞到很多的&#xff0c;之前只有《800多小学生看图背单词ACCESS数据库》以及其他一些几百条的记录&#xff0c;而今天弄到了上万英语单词的图片&#xff0c;今天这份数据只有图片没有其他的数据&#xff0c;你可以使用其他的英语单词数据库和图片进行关联…

群晖NAS本地搭建可远程交互的大型语言模型LLM聊天机器人

文章目录 前言1. 拉取相关的Docker镜像2. 运行Ollama 镜像3. 运行Chatbot Ollama镜像4. 本地访问5. 群晖安装Cpolar6. 配置公网地址7. 公网访问8. 固定公网地址 前言 本文主要分享如何在群晖NAS本地部署并运行一个基于大语言模型Llama 2的个人本地聊天机器人并结合内网穿透工具…

零基础学习Redis(2) -- Redis安装与配置

Redis官方是并不支持Windows系统的&#xff0c;并且现在绝大部分公司都是使用的Linux&#xff0c;所以我们在Linux上进行安装&#xff0c;这里我使用的是Ubuntu 1. 安装步骤 1. 首先使用工具连接到我们的云服务器&#xff0c;然后输入apt指令搜索redis相关的软件包&#xff1…

【扒代码】roi_align的定义

这段代码是一个名为 roi_align 的函数的部分实现&#xff0c;它用于执行区域兴趣&#xff08;RoI&#xff09;对齐操作&#xff0c;通常用于计算机视觉任务中&#xff0c;例如目标检测和分割。这个函数的主要目的是从输入特征图中提取特定区域&#xff0c;并将这些区域调整到指…

8.14 Day19 Windows服务器(Windows service 2008 R2)上域的搭建 (2)

1、在活动目录中创建OU 2、OU的规划例题&#xff1a; 在新添加的域控制器中&#xff0c;使用“Active Directory用户和计算机”创建北京分公司的OU&#xff0c;并创建市场部、技术部和财务部等三个子OU。 若真要删除&#xff0c;则如下操作&#xff1a; 所有OU规划完成 3、域…

Docker Containerd初体验

Docker Containerd概述 ​ Containerd是一个开源的容器运行时&#xff0c;它提供了一种标准化的方式来管理容器的生命周期。该项目最初是由Docker开发团队创建的&#xff0c;并在后来成为了一个独立的项目&#xff0c;被纳入了Cloud Native Computing Foundation&#xff08;C…

零基础学习大模型

揭秘大模型智能背后的神秘力量 前言 在这个信息爆炸的时代&#xff0c;人工智能&#xff08;AI&#xff09;已经渗透到我们生活的方方面面。其中&#xff0c;大模型&#xff08;LLM&#xff09;以其强大的语言处理能力和广泛的应用场景&#xff0c;成为了AI领域的一颗璀璨明珠…

用这工具开发go语言程序,谁都可以成为程序员

前言 在之前有关TitanIDE的文章中&#xff0c;展示了使用TitanIDE开发任何一种语言的程序都显得尤为简单&#xff0c;所以毫无例外的&#xff0c;我们在TitanIDE开发一个go程序同样简单&#xff0c;话不多说&#xff0c;上才艺 在TitanIDE开发你的第一个go程序 1.创建go项目…

【海贼王航海日志:前端技术探索】一篇文章带你走进JavaScript(二)

目录 1 -> 基础数据类型 1.1 -> 条件语句 1.1.1 if语句 1.2 -> 分支语句 1.2.1 -> switch语句 1.3 -> 循环语句 1.3.1 -> while循环 1.3.2 -> continue 1.3.3 -> break 1.3.4 -> for循环 1.4 -> 数组 1.4.1 -> 创建数组 1.4.2 -…