比赛 2020级再出发之二进制拆分及运用 评测结果 AAAAAAAAAA
题目名称 麦森数 最终得分 100
用户昵称 宇战 运行时间 0.048 s
代码语言 C++ 内存使用 2.88 MiB
提交时间 2023-07-24 16:33:06
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
long long p,n,m;
long long ans[2000],cc[2000];
void mul(long long a[],long long b[],bool ff){
    long long c[2000];
    memset(c,0,sizeof(c));
    for(int i=1;i<=a[0];i++){
        for(int j=1;j<=b[0];j++){
            if(i+j-1>500)continue;
            c[i+j-1]+=a[i]*b[j];
            c[0]=i+j-1;
            
        }
    }
    for(int i=1;i<c[0];i++){
        c[i+1]+=c[i]/10;
        c[i]%=10;
    }
    if(c[c[0]]>=10){
        c[0]++; 
        c[c[0]]=c[c[0]-1]/10;
        c[c[0]-1]%=10;
    }
    if(ff){
       for(int i=0;i<=c[0];i++){
        ans[i]=c[i];
    } 
}else{
    for(int i=0;i<=c[0];i++){
        cc[i]=c[i];
    } 
}
    
    return;
}
int main(){
    freopen("mason.in","r",stdin);
    freopen("mason.out","w",stdout);
      
      scanf("%lld",&p);cout<<long(p*log10(2))+1<<endl;
      ans[0]=1;
      ans[1]=1;
      cc[0]=1;
      cc[1]=2;
for(;p;p>>=1){
if(p&1){
            mul(ans,cc,1);
    }
    mul(cc,cc,0);
}

int q=0;
for(int i=500;i>1;i--){
    printf("%lld",ans[i]);
    q++;
    if(q==50){
        printf("\n");
        q=0;
    }
}
printf("%lld",ans[1]-1);

      return 0;     
}