求助大佬,为什么Dev上能正常编译的代码会CE

P1045 [NOIP2003 普及组] 麦森数

奥特战士 @ 2020-10-28 16:14:59

代码如下

#include<bits/stdc++.h>
using namespace std;
const int N=2e6;
int p;
int tmp[N],ans[N]={0,1},num[N]={0,2},lena=1,lenb=1;
inline int read(){
    int s=1,w=0;
    char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')s=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){w=(w<<3)+(w<<1)+ch-'0';ch=getchar();}
    return s*w;
}
inline void write(int x){
    if(x<0){
        putchar('-');
        x=-x;
    }
    if(x>9)write(x/10);
    putchar(x%10+'0');
    return;
}
void gjca(){
    int len=lena+lenb-1;
    for(int i=1;i<=lena;i++){
        for(int j=1;j<=lenb;j++){
            tmp[i+j-1]+=ans[i]*num[j];
        }
    }
    for(int i=1;i<=len;i++){
        tmp[i+1]+=tmp[i]/10;
        tmp[i]%=10;
    } 
    while(tmp[len+1]>0){
        len++;
        tmp[len+1]+=tmp[len]/10;
        tmp[len]%=10;
    }
    for(int i=1;i<=len;i++){
        ans[i]=tmp[i];
        tmp[i]=0;
    }
    lena=len;
    return;
}
void gjcb(){
    int len=2*lenb-1;
    for(int i=1;i<=lenb;i++){
        for(int j=1;j<=lenb;j++){
            tmp[i+j-1]+=num[i]*num[j];
        }
    }
    for(int i=1;i<=len;i++){
        tmp[i+1]+=tmp[i]/10;
        tmp[i]%=10;
    } 
    while(tmp[len+1]>0){
        len++;
        tmp[len+1]+=tmp[len]/10;
        tmp[len]%=10;
    }
    for(int i=1;i<=len;i++){
        num[i]=tmp[i];
        tmp[i]=0;
    }
    lenb=len;
    return;
}
void ksm(int p){
    while(p){
        if(p&1)gjca();
        p>>=1;
        gjcb();
    }
    return;
}
int main(){
    p=read();
    ksm(p);
    ans[1]--;
    write(lena);
    for(int i=500;i>=1;i--){
        if(i%50==0)puts("");
        putchar(ans[i]+'0');
    }
    return 0;
}

by Schwarzkopf_Henkal @ 2020-10-28 16:20:13

不要用大括号初始化数组


by 奥特战士 @ 2020-10-28 16:26:28

@Schwarzkopf_Henkal 谢谢大佬,已经过了


|