90分求救!
代码:
#include<bits/stdc++.h>
#define ll long long
#define V inline void
#define mes 100000000
using namespace std;
int m;
string inn;
ll n[3000];int wn;
ll l[3000];int wl;
ll mid[3000];int wm;
ll mmid[3000];int wd;
ll r[3000];int wr;
ll ls[3000];int wls;
ll ksm[3000];int wk;
int csl,csr;
V copy()
{
for(int i=1;i<=wm;i++) mmid[i]=mid[i];
for(int i=wm+1;i<=wd;i++) mmid[i]=0;
wd=wm;
}
V csh()
{
wl=1;wr=1;
if(csl>=0) l[1]=1;
r[1]=1;
for(int i=1;i<=csl;i++)
{
l[wl]*=10;
if(i%8==0)
{
l[wl]=0;
l[++wl]++;
}
}
for(int i=1;i<=csr;i++)
{
r[wr]*=10;
if(i%8==0)
{
r[wr]=0;
r[++wr]++;
}
}
}
V gmid()
{
for(int i=1;i<=wm;i++) mid[i]=0;
for(int i=1;i<=wls;i++) ls[i]=0;
for(int i=1;i<=wr;i++) ls[i]=l[i]+r[i];
for(int i=1;i<=wr;i++)
{
ls[i+1]+=ls[i]/mes;
ls[i]%=mes;
}
wm=wr;wls=wr;
if(ls[wm+1]>0) wm++;
for(int i=wm;i>=1;i--)
{
mid[i]=ls[i]/2;
ls[i-1]+=ls[i]%2*mes;
}
if(mid[wm]==0) wm--;
}
inline bool cmpmn()
{
if(wm!=wn) return wm<wn;
else
{
for(int i=wm;i>=1;i--)
{
if(mid[i]!=n[i]) return mid[i]<n[i];
}
return true;
}
}
V chmk()
{
for(int j=1;j<=wls;j++)
{
ls[j]=0;
}
for(int i=1;i<=wk;i++)
{
for(int j=1;j<=wm;j++)
{
ls[i+j-1]+=ksm[i]*mid[j];
}
for(int j=i;j<=i+wm;j++)
{
ls[j+1]+=ls[j]/mes;
ls[j]%=mes;
}
}
wm+=wk;
while(ls[wm]==0)
{
wm--;
}
wls=wm;
for(int i=1;i<=wm;i++) mid[i]=ls[i];
}
V chkk()
{
for(int j=1;j<=wls;j++)
{
ls[j]=0;
}
for(int i=1;i<=wk;i++)
{
for(int j=1;j<=wk;j++)
{
ls[i+j-1]+=ksm[i]*ksm[j];
}
for(int j=i;j<=i+wk;j++)
{
ls[j+1]+=ls[j]/mes;
ls[j]%=mes;
}
}
wk+=wk;
while(ls[wk]==0&&wk>1)
{
wk--;
}
wls=wk;
for(int i=1;i<=wk;i++) ksm[i]=ls[i];
}
V fst()
{
ll i=1;
copy();
for(int j=1;j<=wm;j++)
{
ksm[j]=mid[j];
mid[j]=0;
}
wk=wm;
for(int j=wm+1;j<=wk;j++)
{
ksm[j]=0;
}
mid[1]=1;wm=1;
while(i<=m)
{
if(i&m)
{
chmk();
}
chkk();
i*=2;
}
}
inline bool cmplr()
{
for(int i=wr;i>1;i--)
{
if(l[i]!=r[i]) return false;
}
if(r[1]-l[1]<=1) return true;
else return false;
}
V cglm()
{
for(int i=1;i<=wd;i++) l[i]=mmid[i];
wl=wd;
}
V cgrm()
{
for(int i=1;i<=wr;i++) r[i]=mmid[i];
wr=wd;
}
int main()
{
cin>>m>>inn;
wn=0;
ll sm=1;
for(int i=0;i<inn.size();i++)
{
if(i%8==0)
{
wn++;
sm=1;
}
else sm*=10;
n[wn]+=(ll)(inn[inn.size()-1-i]-'0')*sm;
}
csr=inn.size()/m+1;
csl=inn.size()/m-1;
csh();
while(!cmplr())
{
gmid();
fst();
if(cmpmn()) cglm();
else cgrm();
}
ll wz=8*wl-8;
cout<<l[wl];
while(l[wl]>0)
{
wz++;
l[wl]/=10;
}
if(wz==239) l[1]++;
for(int i=wl-1;i>=1;i--) printf("%08lld",l[i]);
return 0;
}
第八个点总是莫名其妙地少了1,改大初始右端点值还是少1
求救qwq!