在用小号切水题时意外发现以前AC的代码过不了后几个点,虽然还是100pts但是显示unaccept
浪费使用了一次下载数据点,发现是结果为零时代码没有输出,去题解区看了一眼,发现还是有不少代码没考虑到这一点 (如果有大佬之前就想到了这一点,当我没说),补了一个特判又A掉了,弱弱地出来说句话,,,,,
#include<bits/stdc++.h>
using namespace std;
string s1;
int m[1001],n[1001],N[200],s[80],K;
struct data {
int num[100];
} f[60][60],ans,a[50][50];
bool cmp(int x[],int y[]) {
if(x[0]!=y[0])
return x[0]>y[0];
for(int p=x[0]; p>=1; p--) {
if(x[p]>y[p]) {
return 1;
}
if(x[p]<y[p]) {
return 0;
}
}
return 0;
}
void mul(int n[],int m[]) {
int j1,j2;
memset(s,0,sizeof(s));
s[0]=n[0]+m[0];
for(j1=1; j1<=n[0]; j1++) {
for(j2=1; j2<=m[0]; j2++) {
s[j1+j2-1]+=n[j1]*m[j2];
s[j1+j2]+=s[j1+j2-1]/10;
s[j1+j2-1]%=10;
}
}
while(!s[s[0]])
{
s[0]--;
}
}
void record(int p1,int p2)
{
int i,j=0;
a[p1][p2].num[0]=p2-p1+1;
for(i=p1;i<=p2;i++)
{
a[p1][p2].num[++j]=N[i];
}
}
int main() {
cin>>N[0]>>K;
int i,j,k;
cin>>s1;
for(i=N[0],j=0;i>=1;i--,j++)
{
N[i]=int(s1[j]-'0');
}
for(i=1;i<=N[0];i++)
{
for(j=i;j<=N[0];j++)
{
record(i,j);
}
}
for(i=1;i<=N[0];i++)
{
memcpy(f[i][0].num,a[1][i].num,sizeof(a[1][i].num));
}
for(k=1;k<=K;k++)
{
for(i=k+1;i<=N[0];i++)
{
for(j=k;j<i;j++)
{
memset(s,0,sizeof(s));
mul(f[j][k-1].num,a[j+1][i].num);
bool flag=cmp(s,f[i][k].num);
if(flag)
memcpy(f[i][k].num,s,sizeof(s));
}
}
}
for(i=f[N[0]][K].num[0];i>=1;i--)
{
cout<<f[N[0]][K].num[i];
}
if(f[N[0]][K].num[0]<1)cout<<0;//新加上这一句
return 0;
}