数学——洛谷P1045 麦森数

来源:互联网 发布:mac book pro 型号 编辑:程序博客网 时间:2024/06/15 14:27

https://www.luogu.org/problem/show?pid=1045
高精度对于这道题是没什么难度的;
毕竟我的高精度模版还是很好的;
高精的时候只要保留最后500位就好啦;
那这个怎么求位数呢?
??????
看了一下题解,我靠对数
我靠log
我靠普及提高-;
不行,我要去学对数了

#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#define Ll long longusing namespace std;const Ll NN=1e1;const int N=1;struct H{    int a[10000],len;    H(){memset(a,0,sizeof a);len=1;}    void clear(){memset(a,0,sizeof a);len=1;}}a;H in(int x){    H a;    if(!x)return a;    a.len=0;    while(x){a.a[++a.len]=x%NN;x=x/NN;}    return a;}int check(H a,H b){    if(a.len>b.len)return 1;    if(a.len<b.len)return -1;    for(int i=a.len;i;i--)        if(a.a[i]!=b.a[i])            if(a.a[i]>b.a[i])return 1;else return -1;    return 0;}H jian(H a,H b){    if(check(a,b)==0){H c;return c;}    for(int i=1;i<=b.len;i++)a.a[i]-=b.a[i];    for(int i=1;i<=a.len;i++)        if(a.a[i]<0){a.a[i]+=NN;a.a[i+1]-=1;}    if(!a.a[a.len])a.len--;    return a;}H chen(H a,H b){    H z;    z.len=a.len+b.len+2;    for(int i=1;i<=a.len;i++)    for(int j=1;j<=b.len;j++)z.a[i+j-1]+=(a.a[i]*b.a[j]);    for(int i=1;i<=z.len;i++)z.a[i+1]+=z.a[i]/NN,z.a[i]%=NN;        while(z.len>1&&!z.a[z.len])z.len--;    z.len=min(1000,z.len);    return z;}H ksm(H a,int n){    if(n==0)return in(1);    if(n==1)return a;    H c=ksm(a,n>>1);    c=chen(c,c);    if(n&1)c=chen(c,a);    return c;}int p,sum=500;int main(){    scanf("%d",&p);    a=jian(ksm(in(2),p),in(1));    cout<<int(p*log10(2)+1)<<endl;    while(sum){        if(a.len<sum)printf("0");else printf("%d",a.a[sum]);        if(--sum%50==0)printf("\n");    }}
1 0