锰锌求助高精
查看原帖
锰锌求助高精
175846
Y_Kirito楼主2021/7/2 18:14

原代码能过样例,提交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;
}
2021/7/2 18:14
加载中...