60分求大佬优化!!!

P1045 [NOIP2003 普及组] 麦森数

justinjia @ 2021-01-12 18:54:44

\colorbox{black}{\color{white}{R44882457 记录详情}} \color{lightblue}{\text{测试点信息}} \#1&\#2&\#3&\#4&\#5&\#6&\#7&\#8&\#9&\#10\\ \colorbox{darkblue}{\color{white}{TLE}}&\colorbox{darkblue}{\color{white}{TLE}}&\colorbox{green}{\color{white}{AC}}&\colorbox{green}{\color{white}{AC}}&\colorbox{green}{\color{white}{AC}}&\colorbox{green}{\color{white}{AC}}&\colorbox{green}{\color{white}{AC}}&\colorbox{green}{\color{white}{AC}}&\colorbox{darkblue}{\color{white}{TLE}}&\colorbox{darkblue}{\color{white}{TLE}} \end{matrix} \color{lightblue}{\text{源代码}}
#include"stdio.h"
#include"math.h"
#define int long long
int p,a[1000000],num,remain,r,len=1,k=499;
signed main(void){
    a[0]=1;
    scanf("%d",&p);
    num=p/30;
    remain=p%30;
    r=pow(2,remain);
    for(int i=0;i<num;i++){
        for(int j=0;j<len;j++)
            a[j]*=1073741824/*2^30*/;
        for(int j=1;j<=len;j++){
            a[j]+=a[j-1]/10;
            a[j-1]%=10;
        }
        while(a[len]){
            a[len+1]+=a[len]/10;
            a[len++]%=10;
        }
    }
    for(int i=0;i<len;i++)
        a[i]*=r;
    for(int i=1;i<=len;i++){
        a[i]+=a[i-1]/10;
        a[i-1]%=10;
    }
    while(a[len]){
        a[len+1]+=a[len]/10;
        a[len++]%=10;
    }
    a[0]--;
    printf("%d\n",len);
    for(int i=0;i<10;i++){
        for(int j=0;j<50;j++)
            printf("%lld",a[k--]);
        printf("\n");
    }
    return 0;
}

本人不太懂快速幂这个东西因为我太蒻了,所以顺便问一下各位大佬有没有不用快速幂的方法?(打表除外)


|