南邮 OJ 1427 麦森数
2015-08-05 15:41
393 查看
麦森数
时间限制(普通/Java) : 1000 MS/ 3000 MS 运行内存限制 : 65536 KByte总提交 : 81 测试通过 : 32
比赛描述
形如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-11行:十进制高精度数2P-1的最后500位数字(每行输出50位,共输出10行,不足500位时高位补0);
不必验证2P-1与P是否为素数。
样例输入
1279
样例输出
386
00000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000
00000000000000104079321946643990819252403273640855
38615262247266704805319112350403608059673360298012
23944173232418484242161395428100779138356624832346
49081399066056773207629241295093892203457731833496
61583550472959420547689811211693677147548478866962
50138443826029173234888531116082853841658502825560
46662248318909188018470682222031405210266984354887
32958028878050869736186900714720710555703168729087
提示
题目来源
JSOI2010
/* AC 15MS Internet #include<iostream> #include<cmath> #define N 126 using namespace std; int ans ,anspow ,c ; void mult(int ans[],int anspow[]){ int i,j; for(i=0;i<N;i++){ c[i] = 0; } for(i=0;i<N;i++){ for(j=0;i+j<N;j++){ c[i+j]+=ans[j]*anspow[i]; } for(j=0;j<N-1;j++){ c[j+1]+=c[j]/10000; c[j]%=10000; } } for(i=0;i<N;i++){ ans[i] = c[i]; } } int main(){ int P,i; scanf("%d",&P); printf("%d\n",(int)( P * log10((float)2)+1) ); ans[0]=1; anspow[0]=2; while(P){ if( P & 1) mult(ans,anspow); P>>=1; mult(anspow,anspow); } ans[0]--; for(i=124;i>=0;i--){ if(i%25==12){ printf("%02d\n%02d",ans[i]/100,ans[i]%100); }else{ printf("%04d",ans[i]); if(i%25==0){ printf("\n"); } } } } */ #include<iostream> #include<cmath> #define N 251 //这里要多一位,否则会WA2 int r ,p ,t ; void mul(int *a,int *b){ int i,j; memset(t,0,sizeof(t)); for(i=0;i<N;i++){ for(j=0;i+j<N;j++){ t[i+j] += a[i]*b[j]; } } for(i=1;i<N;i++){ t[i] += t[i-1]/100; t[i-1] %= 100; } for(i=0;i<N;i++){ a[i] = t[i]; } } int main(){ int P,i; scanf("%d",&P); printf("%d\n",(int)( P * log10((float)2)+1) ); r[0] = 1; p[0] = 2; while(P){ if(P&1){ mul(r,p); } mul(p,p); P >>= 1; } r[0]--; for(i=N-2;i>=0;i--){ printf("%02d",r[i]); if(i%25==0){ printf("\n"); } } }
相关文章推荐
- hdu 1690 floyd
- IO流
- 信号量 例子
- HDU 5348 MZL's endless loop(思想用的是深搜)经典
- 用VS2008编译(zlib)C语言代码的方法
- ppt中的图片批量保存的方法(及像素分辨率换算)
- android:versionCode和android:versionName用途
- PCIe数据峰值带宽和有效带宽计算
- How to Solve oracle.jbo.ConfigException: JBO-33001 Environment (JDeveloper, ADF BC, ADF Faces) When
- 详解java线程状态
- OpenVolumeMesh编译的一些错误解决
- iOS绘图
- Spark入门实战系列--2.Spark编译与部署(上)--基础环境搭建
- 【好文分享】移动端的前端写法:图文并茂让你立刻看懂什么是移动端响应式网页
- C++中的四种转型操作符
- Puppet整合Foreman(四):安装foreman(分离式)
- js 按键事件
- Linux中ifreq 结构体分析和使用
- jquery EasyUI 心得--------环境搭建
- Java常见面试问题(二)