原代码能过样例,提交60分,刚好差了高精,然而加了高精之后出了亿点小问题,样例输出000000000000000000000000000000036
原代码:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=45,K=10;
ll f[N][K];
int main()
{
int n,k;
scanf("%d%d",&n,&k);
string s;
cin>>s;
ll t=0;
for(int i=1;i<=n;++i)
{
t=t*10+s[i-1]-'0';
f[i][0]=t;
}
for(int i=1;i<=n;++i)
{
for(int j=1;j<=k;++j)
{
for(int k=1;k<i;++k)
{
t=0;
for(int l=k+1;l<=i;++l)
t=t*10+s[l-1]-'0';;
f[i][j]=max(f[i][j],f[k][j-1]*t);
}
}
}
printf("%lld",f[n][k]);
return 0;
}
现:
#include<bits/stdc++.h>
using namespace std;
const int N=45,K=10;
int f[N][K][N*N],lf[N][K],t[N*N],lt,c[N*N],lc;
void mul(int a[],int la,int b[],int lb)
{
memset(c,0,sizeof(c));
lc=0;
for(int i=1;i<=la;++i)
for(int j=1;j<=lb;++j)
c[i+j-1]+=a[i]*b[j];
lc=la+lb-1;
for(int i=1;i<=lc;++i)
{
c[i+1]+=c[i]/10;
c[i]%=10;
}
if(c[lc+1]>0)
++lc;
return;
}
bool Max(int a[],int la,int b[],int lb)
{
if(la!=lb)
return la<lb;
for(int i=la;i>=1;--i)
if(a[i]!=b[i])
return a[i]<b[i];
return false;
}
int main()
{
int n,k;
scanf("%d%d",&n,&k);
string s;
cin>>s;
for(int i=1;i<=n;++i)
{
for(int j=lt;j>=1;--j)
swap(t[j+1],t[j]);
t[1]=s[i-1]-'0',++lt;
for(int j=1;j<=lt;++j)
f[i][0][j]=t[j];
lf[i][0]=lt;
}
for(int i=1;i<=n;++i)
{
for(int j=1;j<=k;++j)
{
for(int k=1;k<i;++k)
{
memset(t,0,sizeof(t));
for(int l=k+1;l<=i;++l)
{
for(int r=lt;r>=1;--r)
swap(t[r+1],t[r]);
t[1]=s[l-1]-'0',++lt;
}
mul(f[k][j-1],lf[k][j-1],t,lt);
if(Max(f[i][j],lf[i][j],c,lc)==true)
{
for(int l=1;l<=lc;++l)
f[i][j][l]=c[l];
lf[i][j]=lc;
}
}
}
}
for(int i=lf[n][k];i>=1;--i)
printf("%d",f[n][k][i]);
return 0;
}