1064: 麦森数

时间限制: 1 Sec  内存限制: 128 MB

提交: 52  解决: 9

[提交][状态][讨论版]

题目描述

形如2P-1的素数称为麦森数,这时P一定也是个素数。但反过来不一定,即如果P是个素数,2P-1不一定也是素数。到1998年底,人们已找到了37个麦森数。最大的一个是P=3021377,它有909526位。麦森数有许多重要应用,它与完全数密切相关。
任务:从文件中输入P(1000<P<3100000),计算2P-1的位数和最后500位数字(用十进制高精度数表示)

输入

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

输出

第一行:十进制高精度数2P-1的位数。
第2行:十进制高精度数2P-1的最后500位数字。(不足500位时高位补0)
不必验证2P-1与P是否为素数。

样例输入

1279

样例输出

386
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010407932194664399081925240327364085538615262247266704805319112350403608059673360298012239441732324184842421613954281007791383566248323464908139906605677320762924129509389220345773183349661583550472959420547689811211693677147548478866962501384438260291732348885311160828538416585028255604666224831890918801847068222203140521026698435488732958028878050869736186900714720710555703168729087



#include<stdio.h>
#include<string.h>
#include<math.h>
/*
   第一层难点要知道用对数求位数
   第二层难点要进行大整数运算
*/
struct num { char a[500]; int size; };
void shl(num &n,int k){
	int i;
	i = n.size - 1;
	if (i + k >= 500)i = 500 - 1 - k;
	for (; i >= 0; i--)
		n.a[i + k] = n.a[i];
	n.size += k;
	if (n.size > 500)n.size = 500;
	for (i = 0; i < k; i++)n.a[i] = 0;
}
num add(num a, num b){
	num c;
	memset(&c, 0, sizeof(c));
	int i = 0;
	if (a.size > b.size)c.size = a.size;
	else c.size = b.size;
	for (i = 0; i < c.size; i++)
	{
		c.a[i] += a.a[i] + b.a[i];
		c.a[i + 1] += c.a[i] / 10;
		c.a[i] %= 10;
	}
	if (c.a[i] != 0)c.size++;
	if (c.size>500)c.size = 500;
	return c;
}
num multiply(num a, int b){
	num c;
	memset(&c, 0, sizeof(c));
	if (b == 0)return c;
	if (b == 1)return a;
	c.size = a.size;
	int i;
	for (i = 0; i < a.size; i++){
		c.a[i] += a.a[i] * b;
		c.a[i + 1] += c.a[i] / 10;
		c.a[i] %= 10;
	}
	if (c.a[i] != 0)c.size++;
	if (c.size>500)c.size = 500;
	return c;
}
num mul(num a, num b){
	num c,t;
	memset(&c, 0, sizeof(c));
	int i;
	for (i = 0; i < b.size; i++){
		memcpy(&t ,& multiply(a, b.a[i]),sizeof(t));
		shl(t, i);
		memcpy(&c ,&add(c, t),sizeof(c));
	}
	return c;
}
num pow(num a, int k){
	if (k == 1)return a;
	num t;
	memcpy(&t ,& pow(a,k / 2),sizeof(t));
	if (k % 2 == 1)return mul(mul(t, t), a);
	else return mul(t, t);
}
int main(){
	freopen("in.txt", "r", stdin);
	int p;
	scanf("%d", &p);
	num a;
	memset(&a, 0, sizeof(a));
	a.size = 1;
	a.a[0] = 2;
	memcpy(&a,&pow(a,p),sizeof(a));
	int digit = log10((double)2)*p;
	printf("%d\n", digit + 1);
	int i;
	for (i = 0; i < 500; i++)
	if (a.a[i] == 0)a.a[i] = 9;
	else break;
	a.a[i]--;
	for (i = 0; i < 500;i++)
		printf("%d", a.a[500-1-i]);
	return 0;
}

东大OJ-麦森数的更多相关文章

  1. NOIP200304麦森数

    试题描述 形如2P-1的素数称为麦森数,这时P一定也是个素数.但反过来不一定,即如果P是个素数,2P-1不一定也是素数.到1998年底,人们已找到了37个麦森数.最大的一个是P=3021377,它有9 ...

  2. 【转】[NOIP2003普及组]麦森数

    来源:http://vivid.name/tech/mason.html 不得不纪念一下这道题,因为我今天一整天的时间都花到这道题上了.因为这道题,我学会了快速幂,学会了高精度乘高精度,学会了静态查错 ...

  3. vijosP1223麦森数

    vijosP1223麦森数 链接:https://vijos.org/p/1223 [思路] 快速幂+高精乘. 计算2^p-1可以快速幂的方法在O(logn)的时间内出解,限于数据范围我们需要用到高精 ...

  4. 【高精度乘法】NOIP2003麦森数

    题目描述 形如2^{P}-12P−1的素数称为麦森数,这时PP一定也是个素数.但反过来不一定,即如果PP是个素数,2^{P}-12P−1不一定也是素数.到1998年底,人们已找到了37个麦森数.最大的 ...

  5. 洛谷试炼场-简单数学问题-P1045 麦森数-高精度快速幂

    洛谷试炼场-简单数学问题 B--P1045 麦森数 Description 形如2^P−1的素数称为麦森数,这时P一定也是个素数.但反过来不一定,即如果PP是个素数,2^P-1 不一定也是素数.到19 ...

  6. TZOJ 4839 麦森数(模拟快速幂)

    描述 形如2^P-1的素数称为麦森数,这时P一定也是个素数.但反过来不一定,即如果P是个素数,2^P-1不一定也是素数.到1998年底,人们已找到了37个麦森数.最大的一个是P=3021377,它有9 ...

  7. 洛谷 P1045 麦森数

    题目描述 形如2^{P}-1的素数称为麦森数,这时P一定也是个素数.但反过来不一定,即如果P是个素数,2^{P}-1不一定也是素数.到1998年底,人们已找到了37个麦森数.最大的一个是P=30213 ...

  8. [NOIP2003普及组]麦森数(快速幂+高精度)

    [NOIP2003普及组]麦森数(快速幂+高精度) Description 形如2^P-1的素数称为麦森数,这时P一定也是个素数.但反过来不一定,即如果P是个素数,2^P-1不一定也是素数.到1998 ...

  9. 洛谷P1045 麦森数

    题目描述 形如2^{P}-12 ​P ​​ −1的素数称为麦森数,这时PP一定也是个素数.但反过来不一定,即如果PP是个素数,2^{P}-12 ​P ​​ −1不一定也是素数.到1998年底,人们已找 ...

  10. 麦森数--NOIP2003

    题目描述 形如2P−12^{P}-12P−1 的素数称为麦森数,这时PPP 一定也是个素数.但反过来不一定,即如果PPP 是个素数,2P−12^{P}-12P−1 不一定也是素数.到1998年底,人们 ...

随机推荐

  1. div在浏览器窗口中居中

    让div相对于浏览器窗口居中. 方案一:纯粹使用CSS实现 <!DOCTYPE html> <html> <head> <meta charset=" ...

  2. 欲哭无泪的@Autowired注入对象为NULL

    欲哭无泪啊...一下午的时间就这么被浪费了...一个基于spring mvc和spring data jpa的小项目,当我写完一个controller的测试用例后,一运行却报空指针,跟了下是一个dao ...

  3. 怎样用ZBrush中的shadowbox创建物体

    ZBrush一直以方便著称业内各领域,模型师不需要在多个软件中编辑塑造模型,而在ZBrush用shadowbox创建物体的流程,在Tool面板上的Geometry子面板中,4.0版本引入了shadow ...

  4. 使用javascript对密码进行有密码强度提示的验证

    好些网站的注册功能中,都有对密码进行验证并且还有强度提示.下面就来实现这种效果.密码强度说明:密码强度:弱——纯数字,纯字母,纯符号密码强度:中——数字,字母,符号任意两种的组合密码强度:强——数字, ...

  5. 使用adb shell卸载程序

    个人感觉在命令行中卸载程序要比在手机界面卸载程序要方便许多,配合命令行下的报名查看包名的命令就更加方便了. 1.查看应用准确包名 adb shell pm list package -f |grep ...

  6. Mysql连接错误:Lost connection to Mysql server at 'waiting for initial communication packet'

    在远程连接mysql的时候,连接不上,出现如下报错:Lost connection to MySQL server at 'waiting for initial communication pack ...

  7. MySQL导入sql脚本错误:2006 - MySQL server has gone away

    到如一些小脚本很少报错,但最近导入一个10+M的SQL脚本,却重复报错: Error occured at:2014-03-24 11:42:24 Line no.:85 Error Code: 20 ...

  8. 使用华为U8860测试时出现“Unable to open log device '/dev/log/main': No such file or directory”

    这是因为华为默认禁掉了log输出, 解决办法: 拨号: *#*#2846579#*#* 会显示工程菜单, Go to "ProjectMenu" -> "Backg ...

  9. 解析百度搜索结果链接的url,获取真正的url

    通常,在百度输入关键词搜索出现的列表页,点击目标链接,然而跳转的时候却是百度地址,经过百度解析,才真的跳到目标页面. 在SEO中,经常需要看下自己的网站排名,又不想手动每天手动去点,可用以下方法去得到 ...

  10. DirectoryBrowserMiddleware中间件如何呈现目录结构

    DirectoryBrowserMiddleware中间件如何呈现目录结构 和StaticFileMiddleware中间件一样,DirectoryBrowserMiddleware中间本质上还是定义 ...