1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
| #include<stdio.h> #include<string.h> #include<stdlib.h> int n,k,arr[50]; char str[50]; int dp[7][50][100]; int min(int a,int b){ if(a<b)return a; else return b; } int *mult(int *a,int l,int r){ int *b=(int *)malloc(100*sizeof(int)); memset(b,0,sizeof(int)*100); int remain[100]={0}; for(int i=r;i>=l;i--){ remain[++remain[0]]=arr[i]; } for(int i=1;i<=remain[0];i++){ int w=0; for(int j=1;j<=a[0];j++){ b[j+i-1]=remain[i]*a[j]+b[j+i-1]+w; w=b[j+i-1]/10; b[j+i-1]%=10; } b[0]=a[0]+i-1; while(w){ b[++b[0]]=w%10; w/=10; } } return b; } int cmp(int *a,int *b){ if(a[0]>b[0])return 1; if(a[0]<b[0])return -1; for(int i=a[0];i>0;i--){ if(a[i]>b[i])return 1; if(a[i]<b[i])return -1; } return 0; } int main(){ scanf("%d%d",&n,&k); scanf("%s",str+1); arr[0]=strlen(str+1); for(int i=1;i<=arr[0];i++){ arr[i]=str[i]-'0'; } for(int i=1;i<=arr[0];i++){ for(int j=i;j>0;j--){ dp[0][i][++dp[0][i][0]]=arr[j]; } } for(int i=1;i<=min(k,n-1);i++){ for(int j=i+1;j<=n;j++){ for(int z=i;z<j;z++){ int *c=mult(dp[i-1][z],z+1,j); int judge=cmp(dp[i][j],c); if(judge==-1){ memcpy(dp[i][j],c,sizeof(int)*(c[0]+3)); } free(c); } } } for(int i=dp[k][n][0];i>0;i--){ printf("%d",dp[k][n][i]); } return 0; }
|