求助,wa了8个点

P1045 [NOIP2003 普及组] 麦森数

ljh6jz @ 2020-08-09 15:24:13

#include<cstdio>
#include<cmath>
using namespace std;

const int N=1001000;

int a[N],n,len;

int read();

void pre(){
    for(int s=2;;++s){
        for(int i=1;i<=a[0];++i){
            a[i]*=2;
        }
        for(int i=1;i<=a[0];++i){
            if(a[i]>=10){
                a[i+1]+=a[i]/10;
                a[i]%=10;
            }
        }
        while(a[a[0]+1]>0){
            if(a[0]>500){
                break;
            }
            a[0]++;
        }
        if(a[0]>500)return;
    }
}

int main(){
    n=read();
    a[0]=1;
    a[1]=1;
    printf("%d\n",(int)(len=log10(2)*n+1));
    if(len>500){
        pre();
        n-=500;
        while(n>20){
            for(int i=1;i<=a[0]&&i<=500;++i){
                a[i]*=1048576;
            }
            for(int i=1;i<=a[0]&&i<=500;++i){
                if(a[i]>=10){
                    a[i+1]+=a[i]/10;
                    a[i]%=10;
                }
            }
            while(a[a[0]+1]>0){
                if(a[0]>500){
                    break;
                }
                a[0]++;
            }
            n-=20;
        }
        while(n>0){
            for(int i=1;i<=a[0];++i){
                a[i]*=2;
            }
            for(int i=1;i<=a[0];++i){
                if(a[i]>=10){
                    a[i+1]+=a[i]/10;
                    a[i]%=10;
                }
            }
            while(a[a[0]+1]>0){
                if(a[0]>=500){
                    break;
                }
                a[0]++;
            }
            n--;
        }
        a[1]--;
    //  printf("%d\n",a[0]);
        for(int i=10;i>=1;--i){
            for(int j=0;j<50;++j){
                printf("%d",a[i*50-j]);
            }
            printf("\n");
        }
    }
    else{
        for(int s=1;s<=n;++s){
            for(int i=1;i<=a[0];++i){
                a[i]*=2;
            }
            for(int i=1;i<=a[0];++i){
                if(a[i]>=10){
                    a[i+1]+=a[i]/10;
                    a[i]%=10;
                }
            }
            while(a[a[0]+1]>0){
                if(a[0]>=500){
                    break;
                }
                a[0]++;
            }
        }
        a[1]--;
    //  printf("%d\n",a[0]);
        for(int i=10;i>=1;--i){
            for(int j=0;j<50;++j){
                printf("%d",a[i*50-j]);
            }
            printf("\n");
        }
    }
    return 0;
}

int read(){
    int h=0,w=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){
        if(ch=='-')w=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        h=h*10+ch-'0';
        ch=getchar();
    }
    return h;
}

|