• 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)<<"
    ";
    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 }
  • 相关阅读:
    【bzoj1036】【ZJOI2008】树的统计
    AE基础(8)PageLayout属性设置和添加元素
    AE基础(7)布局控件与地图控件关联
    UtilityAction扩展
    UtilityAction
    AE基础(6)数据查询与选择
    NavigationAction
    LayerAction
    AE基础(5)鹰眼功能
    AE基础(4)画几何图形
  • 原文地址:https://www.cnblogs.com/lidaxin/p/4872620.html
Copyright © 2020-2023  润新知