您的位置:首页 > 其它

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

【代码】

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 }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: