这份代码在lg为啥会CE(应该是高精的问题)
#include<bits/stdc++.h>
using namespace std;
string s;
int n,r;
const int maxlen=1e5;
const int wei=9;
const long long mod=1e9;
struct Node{
int cnt;
long long a[maxlen];
Node(){memset(a,0,sizeof(a)),cnt=0;}
inline void write(){
printf("%lld",a[cnt]);
for(int i=cnt-1;i>=0;i--) printf("%0*lld",wei,a[i]);
}inline friend Node operator + (const Node &x,const Node &y){
Node z;z.cnt=max(x.cnt,y.cnt);
for(int i=0;i<=z.cnt;i++){
z.a[i]+=x.a[i]+y.a[i];
if(z.a[i]>=mod) z.a[i+1]=1,z.a[i]-=mod;
}if(z.a[z.cnt+1]>0) ++z.cnt;
return z;
}inline friend Node operator - (const Node &x,const Node &y){
Node z;z.cnt=x.cnt;
for(int i=0;i<=z.cnt;i++){
z.a[i]+=x.a[i]-y.a[i];
if(z.a[i]<0) z.a[i+1]=-1,z.a[i]+=mod;
}while(z.cnt&&!z.a[z.cnt]) z.cnt--;
return z;
}inline friend Node operator * (const Node &x,const Node &y){
Node z;z.cnt=x.cnt+y.cnt;
for(int i=0;i<=z.cnt;i++)
for(int j=min(i,x.cnt),end=max(i-y.cnt,0);j>=end;j--)
z.a[i]+=x.a[j]*y.a[i-j],z.a[i+1]+=z.a[i]/mod,z.a[i]%=mod;
if(z.a[z.cnt+1]) z.cnt++;
while(z.cnt&&!z.a[z.cnt]) z.cnt--;
return z;
}inline friend Node operator + (const Node &x,const int &s){
Node y;y.a[0]=s;y.cnt=0;
return x+y;
}
inline friend Node operator * (const Node &x,const int &s){
Node y;y.a[0]=s;y.cnt=0;
return x*y;
}inline friend bool operator < (const Node &x,const Node &y){
if(x.cnt!=y.cnt){
return x.cnt<y.cnt;
}for(int i=0;i<=x.cnt;i++){
if(x.a[i]!=y.a[i]){
return x.a[i]<y.a[i];
}
}
}
}a[110][110],dp[110][110];
int main(){
scanf("%d%d",&n,&r);
cin>>s;
for(int i=0;i<n;i++){
for(int j=i;j<n;j++){
for(int k=i;k<=j;k++){
a[i+1][j+1]=a[i+1][j+1]*10;
a[i+1][j+1]=a[i+1][j+1]+(s[k]-'0');
}
}
}for(int i=1;i<=n;i++){
dp[i][0]=a[1][i];
}for(int k=1;k<=r;k++){
for(int i=k+1;i<=n;i++){
for(int j=k;j<i;j++){
dp[i][k]=max(dp[i][k],dp[j][k-1]*a[j+1][i]);
}
}
}dp[n][r].write();
return 0;
}