zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    SuffixArray
    CodeForces722C
    CodeForces1000C
    浅谈定积分
    浅谈线段树
    飞行员配对方案问题
    FhqTreap的区间翻转
    NOI2004郁闷的出纳员
    二分图匹配
    Far Relative’s Problem (贪心 计算来的最多客人)
  • 原文地址:https://www.cnblogs.com/lidaxin/p/4872620.html
Copyright © 2011-2022 走看看