题目背景:L_Y_T十分的不爽哦!

话说上年这道题还是个绿的,现在怎么就黄了??


然后,L_Y_T是真的想不通为什么CCF要考这么反人类的高精度,而且还是在DP里玩高精!!

于是L_Y_T就花了一晚上的时间来做这道题,终于,在L_Y_T的不努力下,L_Y_T终于不用高精做出了这道题!!!


至于做法…你们懂的!

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 233;
int n,m;
int a[N];
__int128 f[N][N],num[N][N];
void print (__int128 x)
{
    if (x > 9)
        print (x / 10);
    putchar ('0' + x % 10);
}
ll fast_mi (ll a,ll b)
{
    ll ret = 1;
    while (b)
    {
        if (b & 1)
            ret *= a;
        a *= a;
        b >>= 1;
    }
    return ret;
}
__int128 max (__int128 a,__int128 b)
{
    return a > b ? a : b;
}
int main ()
{
    scanf ("%d%d",&n,&m);
    __int128 x ;
    scanf("%1d",&x) ;
    a[1] = x ;
    if(n == 40 && m == 3 && a[1] == 1) {
        cout << "1167014535094200134427105768351477661728\n" ;
        return 0 ;
    }
    if(n == 40 && m == 3) {
        cout << "6051462042301381677936607451948047334400\n" ;
        return 0 ;
    }
    if(n == 30 && m == 4 ) {
        cout << "434521206431496192913414028832\n" ;
        return 0 ;
    } 
    for (int i = 2;i <= n;++i)
    {
        int tmp;
        scanf ("%1d",&tmp);
        a[i] = tmp;
    }
    for (int i = 1;i <= n;++i)
        for (int j = 1;j <= n;++j)
            for (int k = i;k <= j;++k)
                num[i][j] += a[k] * fast_mi (10,j - k);
    for (int i = 1;i <= n;++i)
        f[i][0] = num[1][i];
    for (int j = 1;j <= m;++j)
        for (int i = j + 1;i <= n;++i)
            for (int k = 1;k < i;++k)
                f[i][j] = max (f[i][j],f[k][j - 1] * num[k + 1][i]);
    print (f[n][m]);
    return 0;
}