【洛谷 1045】 麦森数

来源:互联网 发布:centos7 yum安装lnmp 编辑:程序博客网 时间:2024/06/08 10:58

思路

首先是输出位数,设位数是w,不难得到:w=log102n+1=n×log102+1,所以可以直接计算。
然后是输出前500位,那就要暴力高精度了,用上快速幂,跑的不算慢。

代码

#include <cmath>#include <cstdio>#include <iostream>#include <cstring> using namespace std;struct _int{    int a1[510];    _int(){memset(a1, 0, sizeof a1);}    _int operator * (const _int &t)const{        _int ans;        for(int i = 1; i <= 500; i ++)            for(int j = 1; j <= 500; j ++)                if(i+j-1 <= 500) ans.a1[i+j-1] += a1[i]*t.a1[j];        for(int i = 1; i <= 500; i ++)            if(ans.a1[i]/10)                ans.a1[i+1] += ans.a1[i]/10, ans.a1[i] %= 10;        return ans;    }    void operator = (const int t1){        _int(); int len = 0, t = t1;        while(t) a1[++len] = t%10, t /= 10;    }    void print(){        for(int i = 500; i >= 2; i --){            if(i%50 == 0) printf("\n");            printf("%d", a1[i]);        }        printf("%d", a1[1]-1);    }};int main(){    int n;    scanf("%d", &n);    double y = log(2)/log(10);    printf("%d", (int)(n*y)+1);    _int a, b;    a = 2, b = 1;    for( ; n; n >>= 1, a = a*a) if(n&1) b = b*a;    b.print();    return 0;}
1 0