vijosP1223麦森数
2016-03-30 17:24
281 查看
vijosP1223麦森数
链接:https://vijos.org/p/1223
【思路】
快速幂+高精乘。
计算2^p-1可以快速幂的方法在O(logn)的时间内出解,限于数据范围我们需要用到高精度。
注意:
1、2^p-1的位数为 (int) (log10(2)*n-1)。
2、计算只要到达500位即可。
3、结果的个位一定不为1,因为2^p-1二进制中2^0号位一定为1。
4、strut的初始化。
【代码】
链接:https://vijos.org/p/1223
【思路】
快速幂+高精乘。
计算2^p-1可以快速幂的方法在O(logn)的时间内出解,限于数据范围我们需要用到高精度。
注意:
1、2^p-1的位数为 (int) (log10(2)*n-1)。
2、计算只要到达500位即可。
3、结果的个位一定不为1,因为2^p-1二进制中2^0号位一定为1。
4、strut的初始化。
【代码】
1 #include<iostream> 2 #include<cstring> 3 #include<cmath> 4 using namespace std; 5 struct Bign{ 6 int len; 7 int num[502]; 8 Bign() { memset(num,0,sizeof(num)); }; //init 9 }; 10 11 int n; 12 int LEN=500; 13 Bign ans,c,tmp; 14 15 void multi(Bign& a, Bign b) 16 { 17 memset(c.num,0,sizeof(c.num)); 18 for(int i=0;i<LEN;i++) 19 for(int j=0;j<LEN;j++) 20 if(i+j<LEN) 21 c.num[i+j] += a.num[i]*b.num[j]; 22 else 23 break; 24 25 for(int i=0;i<LEN;i++){ 26 c.num[i+1] += c.num[i]/10; 27 c.num[i] %= 10; 28 } 29 a=c; 30 } 31 int main() 32 { 33 cin>>n; 34 cout<<(int)(n*log10(2)+1)<<"\n"; 35 36 tmp.len=1; tmp.num[0]=2; 37 ans.len=1; ans.num[0]=1; 38 while(n) { 39 if(n&1) multi(ans,tmp); 40 multi(tmp,tmp); 41 n>>=1; 42 } 43 44 ans.num[0]--; 45 int cnt=0; 46 for(int i=LEN-1;i>=0;i--) { 47 cout<<ans.num[i]; 48 if(++cnt%50==0) cout<<endl; 49 } 50 return 0; 51 }
相关文章推荐
- vijosP1543 极值问题
- vijosP1115 火星人
- vijosP1137 组合数
- MacPorts卡在"正在运行软件包脚本"解决方法
- mysql常见的运算符及使用
- 4_01 计算组合数(函数)
- linux的nohup命令的用法
- maven 资料
- 2875: [Noi2012]随机数生成器
- 对象转JSON注意点
- 分段和分页
- iOS摄像头和相册-UIImagePickerController-浅析
- Mac OS X 的文件系统
- NOIP2005 过河
- NOIP2005 篝火晚会
- NOIP2005 等价表达式
- NOIP2004 津津的储蓄计划
- NOIP2004 合并石子
- NOIP2004 合唱队列
- NOIP2004 虫食算