为什么会RE

P1045 [NOIP2003 普及组] 麦森数

Surge_of_Force @ 2021-08-07 10:45:45

#include<bits/stdc++.h>
using namespace std;
string ggc(string,string);
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int p;
    cin>>p;
    cout<<int(log10(2)*p+1)<<endl; 
    //10^n有n+1位,令2^p=k,2=10^lg(2),k=(10^lg(2))^p
    //=10^(lg(2)*p),所以2^p有lg(2)+1位
    string anss="1",b="2";
    //快速幂: 
    while(p)
    {
        if(p&1)
           anss=ggc(anss,b);
        p>>=1;
        b=ggc(b,b);
    }
    int jy=anss[anss.size()-1]-'0';
    jy--;
    anss[anss.size()-1]=char(jy+'0');
    cout<<anss;
    //cout<<ggc("2","3");
}
string ggc(string a,string b)
{
    int x[1021]={0},y[1021]={0},z[1021]={0};
    string ans="0";
    //if(a=="0"||b=="0")
    //  return "0";
    //int lla=a.size(),llb=b.size(); 
    //int la=min(lla,500),lb=min(llb,500);
    int la=500,lb=500;
    for(int i=la;i>=1;i--)
        x[i]=a[la-i]-'0';
    for(int i=lb;i>=1;i--)
        y[i]=b[lb-i]-'0';
    for(int i=1;i<=la;i++)
    {
        for(int j=1;j<=lb;j++)
        {
            z[i+j]+=(z[i+j-1]+x[i]*y[j])/10;
            z[i+j-1]=(z[i+j-1]+x[i]*y[j])%10;
        }
    }
    for(int i=500,j=0;i>=1;i--,j++)
        ans[j]=char(z[i]+'0');
    return ans;
}

by cannothelp @ 2021-08-07 14:21:06

for(int i=la;i>=1;i--) x[i]=a[la-i]-'0'; a字符串一开始有这么多位吗


|