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. 绕过校园网的共享限制 win10搭建VPN服务器实现--从入门到放弃

    一.开篇立论= =.. 上次说到博主在电脑上搭建了代理服务器来绕过天翼客户端的共享限制,然而经过实际测试还不够完美,所以本着生命不息,折腾不止的精神,我又开始研究搭建vpn服务器= =... (上次的 ...

  2. linux原始套接字(2)-icmp请求与接收

    一.概述                                                    上一篇arp请求使用的是链路层的原始套接字.icmp封装在ip数据报里面,所以icmp请 ...

  3. HDU2191悼念512汶川大地震遇难同胞——珍惜现在,感恩生活[多重背包]

    悼念512汶川大地震遇难同胞——珍惜现在,感恩生活 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Jav ...

  4. UI的重用性

    UI抽取思路 一款手机游戏中UI有几十个到上百个不等,如果一个一个做这些UI,无疑会花费很多时间. 近期我们的游戏UI已经是第N次改版了,经过这N多次的修改,我总结了UI其实有很多的共性(就是相同性) ...

  5. arr的高级用法

    arr的高级用法 reduce 方法(升序) 语法: array1.reduce(callbackfn[, initialValue]) 参数 定义 array1 必需.一个数组对象. callbac ...

  6. 字典转换成NSString(NSJson)

    //字典转换成字符串 NSDictionary *dict = [NSMutableDictionary dictionary]; NSData *data = [NSJSONSerializatio ...

  7. 第七课——iOS数据持久化

    今天我们要学习plist.Preference.NSKeyedArchiver.Sqlite.CoreData(属性列表.偏好设置.归档.数据库.模型化对象). 首先plist就是将某些特定类,通过X ...

  8. python的高级特性3:神奇的__call__与返回函数

    __call__是一个很神奇的特性,只要某个类型中有__call__方法,,我们可以把这个类型的对象当作函数来使用. 也许说的比较抽象,举个例子就会明白. In [107]: f = abs In [ ...

  9. wireshake抓包,飞秋发送信息,python

    http://wenku.baidu.com/link?url=Xze_JY8T15pqI9mBLRpTxWF2d6MP-32xb6UwuE6tsUmitRDheJe-Ju87WlDEDBGuI5MF ...

  10. MySQL数据库的优化(上)单机MySQL数据库的优化

    MySQL数据库的优化(上)单机MySQL数据库的优化 2011-03-08 08:49 抚琴煮酒 51CTO 字号:T | T 公司网站访问量越来越大,导致MySQL的压力越来越大,让我们自然想到的 ...