30分 RE7个点 求解

P1045 [NOIP2003 普及组] 麦森数

Andrewlyx @ 2019-11-10 22:25:54

30分 RE7个点 求解

#include <bits/stdc++.h>
#define R register
#define mem(x,y) memset(x,y,sizeof(x))
using namespace std;
const int N=1e3+5;
int p,ans,c[N],e[N],d[N],cnt1=1,cnt2=1;
void multi(int op,int a[],int b[]) {
    mem(e,0);
    int q;
    if(op) q=cnt1;
    else q=cnt2; 
    for(R int i=1; i<=(q<500? q:500); i++) {
        for(R int j=1; j<=cnt2; j++) {
            e[i+j]+=(e[i+j-1]+a[i]*b[j])/10;
            e[i+j-1]=(e[i+j-1]+a[i]*b[j])%10;
        }
    }
    int x=cnt2+q;
    while(!e[x]) x--;
    if(op){
        cnt1=(x>500? 500:x); 
        for(R int i=1;i<=cnt1;i++) c[i]=e[i];
    }
    else {
        cnt2=x; 
        for(R int i=1;i<=cnt2;i++) d[i]=e[i];
    }
}
void pow2(int b) {
    c[1]=1;
    d[1]=2;
    while(b) {
        if(b&1) multi(1,c,d);
        multi(0,d,d);
        b>>=1;
    }
}
int main() {
    cin>>p;
    ans=(p/log2(10))+1;
    cout<<ans<<endl;
    pow2(p);
    c[1]-=1;
    for(R int i=500;i>=1;i--){
        if(i%50==0&&i!=500) cout<<endl;
        if(i>cnt1) cout<<0;
        else cout<<c[i];
    }
    cout<<endl;
    return 0;
}

by Absurdity @ 2019-11-10 22:33:32

@AndyLa 高精压一下位或高精数组开更大试试???


by Andrewlyx @ 2019-11-10 22:36:49

@Mysterious_wind 但好像这样也没有什么问题a


by Absurdity @ 2019-11-10 22:45:26

有点奇怪,没有跟RE有关的地方啊,为啥会是RE???


|