记录编号 195483 评测结果 AAAAA
题目名称 [NOI 1996]添加号 最终得分 100
用户昵称 Gravatarzys 是否通过 通过
代码语言 C++ 运行时间 0.921 s
提交时间 2015-10-18 21:45:31 内存使用 39.04 MiB
显示代码纯文本
#define Max(a,b)((a)>(b)?(a):(b))

#include<cstdio>
#include<cstring>

using namespace std;

struct BIGNUM{
	int s[205];BIGNUM(){clr();return;}
	inline void clr(){memset(s,0,sizeof(s));}
	inline void set(int x){clr();while(x)s[++s[0]]=x%10,x/=10;}
	inline void print(){for(int i=s[0];i>=1;i--)printf("%d",s[i]);}
	friend  BIGNUM operator + (BIGNUM temp_a,BIGNUM temp_b){
		BIGNUM temp_c;int *a=temp_a.s,*b=temp_b.s,*c=temp_c.s;
		c[0]=Max(a[0],b[0])+1;
		for(int i=1;i<=c[0];i++){
			c[i]+=a[i]+b[i];
			if(c[i]>=10)c[i]-=10,c[i+1]++;
		}while(!c[c[0]]&&c[0])c[0]--;
		return temp_c;
	}
	friend BIGNUM operator * (BIGNUM temp_a,BIGNUM temp_b){
        BIGNUM temp_c;int *a=temp_a.s,*b=temp_b.s,*c=temp_c.s;
        for(int i=1;i<=a[0];i++){
			int x=0;
			for(int j=1;j<=b[0];j++){
				c[i+j-1]+=a[i]*b[j]+x;
				x=c[i+j-1]/10;
				c[i+j-1]%=10;
			}c[i+b[0]]=x;
        }c[0]=a[0]+b[0];while(!c[c[0]]&&c[0])c[0]--;
		return temp_c;
	}
	friend BIGNUM Min(BIGNUM temp_a,BIGNUM temp_b){
		int *a=temp_a.s,*b=temp_b.s;
		if(a[0]!=b[0])return a[0]<b[0]?temp_a:temp_b;
		for(int i=a[0];i>=1;i--)if(a[i]!=b[i])return a[i]<b[i]?temp_a:temp_b;
		return temp_a;
	}
};

char s[210];int m,len;
BIGNUM Mul,tot[210][210],num[210],f[210][25],temp;

int main()
{
	freopen("exam4.in","r",stdin);
	freopen("exam4.out","w",stdout);
	scanf("%s",s);scanf("%d",&m);
	len=strlen(s);Mul.set(10);
	for(int i=0;i<len;i++)num[i+1].set(s[i]-'0');
	for(int i=1;i<=len;i++)
	    for(int j=i;j<=len;j++){
			tot[i][j]=tot[i][j-1]*Mul;
			tot[i][j]=tot[i][j]+num[j];
	    }
	for(int i=1;i<=len;i++)f[i][0]=tot[1][i];
	for(int i=1;i<=len;i++){
		for(int j=1;j<i;j++){
			if(j>20)break;
			f[i][j]=f[j][j-1]+tot[j+1][i];
			for(int k=j+1;k<i;k++){
				temp=f[k][j-1]+tot[k+1][i];
			    f[i][j]=Min(f[i][j],temp);
		    }
		}
	}f[len][m].print();
}