山东济南彤昌机械科技有限公司 山东济南江鹏工贸游有限公司

vijosP1223麦森数

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的初始化。

 

【代码】

 

 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 }

 

posted on 2015-10-12 19:42  hahalidaxin  阅读(228)  评论(0)    收藏  举报