东大OJ-麦森数
1064: 麦森数
时间限制: 1 Sec 内存限制: 128 MB
提交: 52 解决: 9
[提交][状态][讨论版]
题目描述
输入
文件中只包含一个整数P(1000<P<3100000)
输出
样例输入
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-麦森数的更多相关文章
- NOIP200304麦森数
试题描述 形如2P-1的素数称为麦森数,这时P一定也是个素数.但反过来不一定,即如果P是个素数,2P-1不一定也是素数.到1998年底,人们已找到了37个麦森数.最大的一个是P=3021377,它有9 ...
- 【转】[NOIP2003普及组]麦森数
来源:http://vivid.name/tech/mason.html 不得不纪念一下这道题,因为我今天一整天的时间都花到这道题上了.因为这道题,我学会了快速幂,学会了高精度乘高精度,学会了静态查错 ...
- vijosP1223麦森数
vijosP1223麦森数 链接:https://vijos.org/p/1223 [思路] 快速幂+高精乘. 计算2^p-1可以快速幂的方法在O(logn)的时间内出解,限于数据范围我们需要用到高精 ...
- 【高精度乘法】NOIP2003麦森数
题目描述 形如2^{P}-12P−1的素数称为麦森数,这时PP一定也是个素数.但反过来不一定,即如果PP是个素数,2^{P}-12P−1不一定也是素数.到1998年底,人们已找到了37个麦森数.最大的 ...
- 洛谷试炼场-简单数学问题-P1045 麦森数-高精度快速幂
洛谷试炼场-简单数学问题 B--P1045 麦森数 Description 形如2^P−1的素数称为麦森数,这时P一定也是个素数.但反过来不一定,即如果PP是个素数,2^P-1 不一定也是素数.到19 ...
- 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 ...
- [NOIP2003普及组]麦森数(快速幂+高精度)
[NOIP2003普及组]麦森数(快速幂+高精度) Description 形如2^P-1的素数称为麦森数,这时P一定也是个素数.但反过来不一定,即如果P是个素数,2^P-1不一定也是素数.到1998 ...
- 洛谷P1045 麦森数
题目描述 形如2^{P}-12 P −1的素数称为麦森数,这时PP一定也是个素数.但反过来不一定,即如果PP是个素数,2^{P}-12 P −1不一定也是素数.到1998年底,人们已找 ...
- 麦森数--NOIP2003
题目描述 形如2P−12^{P}-12P−1 的素数称为麦森数,这时PPP 一定也是个素数.但反过来不一定,即如果PPP 是个素数,2P−12^{P}-12P−1 不一定也是素数.到1998年底,人们 ...
随机推荐
- su认证失败&文件夹里打开终端的方法&atom安装
很久没用笔记本上的ubuntu,用不顺手,比在公司调教了半年多的电脑差远了.一步一步来.先解决最不顺手的三件事 1.su认证失败. 新安装的ubuntu系统是无法切换到root账户的,得做一番修改 s ...
- Bootstrap模态框(modal)垂直居中
http://v3.bootcss.com/ 自己也试了改了几种方式也不容乐观,发现在窗口弹出之前是获取不到$(this).height()的值,本想着是用($(window).height()-$( ...
- JavaScript目录菜单滚动反显组件的实现
JavaScript目录菜单滚动反显组件,有以下两个特点 每个导航菜单项(nav)对应页面一个内容区域(content) 滚动页面到特定内容区域(content)时,对应的菜单会自动切换,一般会添加一 ...
- 大话设计模式C++版——原则和引言
转贴请注明转自:http://blog.csdn.net/gufeng99/article/details/45832711 读程杰的<大话设计模式>有一段时间了,将其C#版的设计模式代码 ...
- AI(Adobe Illustrator)简单入门——小熊
成果: AI里ctrl+z撤销,恢复是ctrl+shift+z. 主要是使用Blob笔刷和橡皮擦工具来做. 一.选择Blog笔刷,选择小熊的颜色. 二.画小熊的头和身子和前脚掌 按住左中括号和右中括号 ...
- [转]jquery开发自定义的插件总结
本文转自:http://www.cnblogs.com/Jimmy009/archive/2013/01/17/jquery%E6%8F%92%E4%BB%B6.html 前几天在玩jquery,今天 ...
- PHP_Bibel阅读学习(一)——看书看经典,写文写代码
基础快速再看一下,然后每天有新的好玩的看. 这本书,反正好评不少,就是`PHP和MySQL Web开发`,机械工业出版社,澳洲人写的,红皮,有兴趣的可以看一下. 第一篇 使用PHP 一.入门 5分钟翻 ...
- Lucene 4.x Spellcheck使用说明
Spellcheck是Lucene新版本的功能,在介绍spellcheck之前,我们需要弄清楚Spellcheck支持几种数据源.Spellcheck构造函数需要传入Dictionary接口: pac ...
- (一)观察者模式-C++实现
观察者模式: 定义对象间的一种一对多的依赖关系,当一个对象的状态发生变化时,所有依赖它的对象都得到通知并被自动更新. 它有四种角色: 主题(Subject):一个接口,规定了具体主题需要实现的方法. ...
- NOIP2002pj产生数[floyd 高精度]
背景 给出一个整数 n(n<10^30) 和 k 个变换规则(k<=15). 规则:一位数可变换成另一个一位数:规则的右部不能为零. 例如:n=234.有规则(k=2):2-> 53 ...