麦森数--NOIP2003
题目描述
形如2P−12^{P}-12P−1 的素数称为麦森数,这时PPP 一定也是个素数。但反过来不一定,即如果PPP 是个素数,2P−12^{P}-12P−1 不一定也是素数。到1998年底,人们已找到了37个麦森数。最大的一个是P=3021377P=3021377P=3021377 ,它有909526位。麦森数有许多重要应用,它与完全数密切相关。
任务:从文件中输入PPP (1000<P<31000001000<P<31000001000<P<3100000 ),计算2P−12^{P}-12P−1 的位数和最后500位数字(用十进制高精度数表示)
输入输出格式
输入格式:
文件中只包含一个整数PPP (1000<P<31000001000<P<31000001000<P<3100000 )
输出格式:
第一行:十进制高精度数2P−12^{P}-12P−1 的位数。
第2-11行:十进制高精度数2P−12^{P}-12P−1 的最后500位数字。(每行输出50位,共输出10行,不足500位时高位补0)
不必验证2P−12^{P}-12P−1 与P 是否为素数。
高精+快速幂
#include<cstdio>
#include<math.h>
#include<string.h>
#include<iostream>
using namespace std;
int P;
double n;
int a[110000],ans[110000];
void read(int &x) //快读
{
int f=1;
char t=getchar();
x=0;
while((t<48)or(t>57))
{
if(t=='-')f=-1;
t=getchar();
}
while((t>=48)and(t<=57))
{
x=x*10+t-48;
t=getchar();
}
x*=f;
}
void jian(int a[])
{
a[1]-=1;
for (int i=1; i<=a[0]; ++i)
{
if (a[i]<0)
{
a[i]+=10;
--a[i+1];
}
else break;
}
}
void cheng(int a[])
{
int len=a[0]+1;
int c[510];
memset(c,0,sizeof(c));
for (int i=1; i<=a[0]; ++i)
{
int t=0;
c[i]=c[i]+t+a[i]*2;
t=c[i]/10;
c[i]%=10;
c[i+1]=t;
}
while ((c[len]==0) && (len>1)) --len;
for (int i=1; i<=len; ++i) a[i]=c[i];
a[0]=len;
}
void cheng1(int a[],int b[])
{
int c[110000];
memset(c,0,sizeof(c));
int n=min(a[0],500),m=min(b[0],500),len=n+m;
for (int i=1; i<=n; ++i)
{
int t=0;
for (int j=1; j<=m; ++j)
{
c[i+j-1]=c[i+j-1]+t+a[i]*b[j];
t=c[i+j-1]/10;
c[i+j-1]%=10;
}
c[i+m]=t;
}
while ((c[len]==0) && (len>1)) --len;
for (int i=1; i<=len; ++i) a[i]=c[i];
a[0]=len;
}
int main()
{
//freopen("mason.in","r",stdin);
//freopen("mason.out","w",stdout);
read(P);
n=(double)P*(double)(log(2)/log(10));//直接算位数
n+=1;
printf("%d",(int)n);
a[1]=2;
a[0]=1;
ans[1]=1;
ans[0]=1;
for (; P; P>>=1,cheng1(a,a)) //p>>=1 等于 p /= 2,cheng1(a,a)为预处理,为cheng1(ans,a)做准备
if (P&1) cheng1(ans,a); //是奇数还要再乘一个
jian(ans);
for (int i=500; i>=1; --i)
{
if (i%50==0) printf("\n");
printf("%d",ans[i]);
}
return 0;
}
麦森数--NOIP2003的更多相关文章
- [NOIP2003普及组]麦森数(快速幂+高精度)
[NOIP2003普及组]麦森数(快速幂+高精度) Description 形如2^P-1的素数称为麦森数,这时P一定也是个素数.但反过来不一定,即如果P是个素数,2^P-1不一定也是素数.到1998 ...
- 【转】[NOIP2003普及组]麦森数
来源:http://vivid.name/tech/mason.html 不得不纪念一下这道题,因为我今天一整天的时间都花到这道题上了.因为这道题,我学会了快速幂,学会了高精度乘高精度,学会了静态查错 ...
- 【高精度乘法】NOIP2003麦森数
题目描述 形如2^{P}-12P−1的素数称为麦森数,这时PP一定也是个素数.但反过来不一定,即如果PP是个素数,2^{P}-12P−1不一定也是素数.到1998年底,人们已找到了37个麦森数.最大的 ...
- P1045 [NOIP2003 普及组] 麦森数
题目描述 形如2^P−1的素数称为麦森数,这时P一定也是个素数.但反过来不一定,即如果P是个素数,2^P−1不一定也是素数. 到1998年底,人们已找到了37个麦森数.最大的一个是P=3021377, ...
- 洛谷试炼场-简单数学问题-P1045 麦森数-高精度快速幂
洛谷试炼场-简单数学问题 B--P1045 麦森数 Description 形如2^P−1的素数称为麦森数,这时P一定也是个素数.但反过来不一定,即如果PP是个素数,2^P-1 不一定也是素数.到19 ...
- NOIP200304麦森数
试题描述 形如2P-1的素数称为麦森数,这时P一定也是个素数.但反过来不一定,即如果P是个素数,2P-1不一定也是素数.到1998年底,人们已找到了37个麦森数.最大的一个是P=3021377,它有9 ...
- vijosP1223麦森数
vijosP1223麦森数 链接:https://vijos.org/p/1223 [思路] 快速幂+高精乘. 计算2^p-1可以快速幂的方法在O(logn)的时间内出解,限于数据范围我们需要用到高精 ...
- TZOJ 4839 麦森数(模拟快速幂)
描述 形如2^P-1的素数称为麦森数,这时P一定也是个素数.但反过来不一定,即如果P是个素数,2^P-1不一定也是素数.到1998年底,人们已找到了37个麦森数.最大的一个是P=3021377,它有9 ...
- 洛谷 P1045 麦森数
题目描述 形如2^{P}-1的素数称为麦森数,这时P一定也是个素数.但反过来不一定,即如果P是个素数,2^{P}-1不一定也是素数.到1998年底,人们已找到了37个麦森数.最大的一个是P=30213 ...
随机推荐
- 【MySQL】RPM包安装
操作系统:Red Hat Enterprise Linux Server release 6.5 Mysql安装包:MySQL-5.6.35-1.linux_glibc2.5.x86_64.rpm-b ...
- SQL基本操作——HAVING
HAVING:在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与合计函数一起使用. 我们拥有下面这个 "Orders" 表: O_Id OrderDate Or ...
- CSS学习笔记----选择器
用过css的同志们都知道,选择器是非常重要的,如果选择器使用不当,即使你的css写的再好,但是不知道要用在哪个元素上,这不是英雄无用武之地吗? css,用过的都说好! 最基本的选择器,id选择器,类选 ...
- 关于Qt 报QDomDocument: No such file or directory错误解决办法
肯定是没有找到相关的路径,这时候只需要在.pro文件中加入便好了,比如我要用到读写xml的一些头文件,则需要在.pro中加入如下代码: 就可以正常引用了.
- CPU指令、机器码、程序和汇编语言
一.指令 指令就是指挥机器工作的指示和命令.控制器靠指令指挥机器工作,人们用指令表达自己的意图,并交给控制器执行.一台计算机所能执行的各种不同指令的全体,叫做计算机的指令系统或指令集,每一台计算机均有 ...
- How To:配置Linux iSCSI客户端
1.安装客户端 [root@node01 Packages]# rpm -Uvh iscsi-initiator-utils-6.2.0.873-2.el6.x86_64.rpm warning: i ...
- 【解题报告】 洛谷 P3492 [POI2009]TAB-Arrays
[解题报告] 洛谷 P3492 [POI2009]TAB-Arrays 这题是我随机跳题的时候跳到的.写完这道题之后,顺便看了一下题解,发现只有一篇题解,所以就在这里顺便写一个解题报告了. 首先当然是 ...
- HUD 1426 Sudoku Killer (DFS)
链接 : Here! 思路 : 记录下所有 "?" , 出现的位置, 然后 $DFS$ 一下, 对于每个位置来说都可以填充 $9$ 种数值, 然后对于判断填充是否合法需要三个标记数 ...
- (C/C++学习)13.C语言字符串处理函数(一)
说明:字符串处理的函数很多,本文将例举经常遇到的一些函数加以说明. 一.字符串的输入输出 头文件:<stdio.h> 1.利用标准输出函数 printf() 来输出,将格式设置为 s% . ...
- office 2016最新安装及激活教程(KMS)【亲测有效】!!
前言 博主的一个朋友,咳咳--你们懂得,想装office,于是我就上网找了一下激活的方法,亲测有效,而且也没有什么广告病毒之类的,还比较方便,所以传上来方便大家.好了,进入正题: 安装office 首 ...