题目背景: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;
}