vijosP1223麦森数
【思路】
快速幂+高精乘。
计算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)<<" "; 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 }