求助
查看原帖
求助
338147
01bit楼主2021/7/30 16:33
#include<cstdio>
#include<cstring>
using namespace std;
struct bignum{
	int a[1005],len;
	void clear(){
		len=0;
		memset(a,0,sizeof(a));
	}
	bignum get(int l,int r){
		bignum c;
		c.len=r-l+1;
		for(int i=0;i<c.len;i++)c.a[i]=a[l+i];
		return c;
	}
};
bignum s2n(char s[]){
	bignum a;
	a.clear();
	int slen=strlen(s);
	for(int i=0;i<slen;i++)a.a[slen-i-1]=s[i]-'0';
	return a;
}
void print(bignum a){
	int i;
	for(i=a.len-1;i>=1;i--)if(a.a[i])break;
	for(;i>=0;i--)putchar(a.a[i]+'0');
	if(!a.len)putchar('0');
}
bignum max(bignum a,bignum b){
	if(a.len!=b.len)return (a.len>b.len?a:b);
	int len=a.len;
	for(int i=0;i<len;i++)
		if(a.a[i]!=b.a[i])return (a.a[i]>b.a[i]?a:b);
	return a;
}
bignum operator *(bignum a,bignum b){
	bignum c;
	c.clear();
	int len=(a.len>b.len?a.len:b.len);
	for(int i=0;i<len;i++){
		for(int j=0;j<=i;j++)c.a[i]+=a.a[j]*b.a[i-j];
		if(c.a[i]>=10){
			c.a[i+1]+=c.a[i]/10;
			c.a[i]%=10;
		}
	}
	while(c.a[len]>=10){
		c.a[len+1]+=c.a[len]/10;
		c.a[len++]%=10;
	}
	c.len=len+1;
	return c;
}


int n,m;
char s[45];
bignum num;
bignum f[45];

int main(){
	scanf("%d%d",&n,&m);
	scanf("%s",&s);
	num=s2n(s);
	for(int i=1;i<=n;i++)f[i]=num.get(0,i-1);
	for(int i=1;i<=m;i++)
		for(int j=n;j>i;j--){
			f[j]=s2n("0");
			for(int k=i;k<j;k++)
				f[j]=max(f[j],f[k]*num.get(k,j-1));
		}
	print(f[n]);
	putchar('\n');
	return 0;
}

2021/7/30 16:33
加载中...