using
System;
using
System.Collections.Generic;
public
class
Program
{
static
long
[,,,] dp =
new
long
[20,2,2,2];
static
Tuple<
long
,
string
> Recur(
string
l,
string
r,
int
pos,
bool
ta,
bool
tb,
bool
st)
{
if
(pos == l.Length) {
return
Tuple.Create<
long
,
string
>(1,
""
);
}
if
(dp[pos, ta ? 1 : 0, tb ? 1 : 0, st ? 1 : 0] != -1)
{
return
Tuple.Create<
long
,
string
>(dp[pos, ta ? 1 : 0, tb ? 1 : 0, st ? 1 : 0],
""
);
}
int
start = ta ? l[pos] -
'0'
: 0;
int
end = tb ? r[pos] -
'0'
: 9;
long
ans = -1;
string
s =
""
;
for
(
int
i = start; i <= end; i++)
{
int
val = i;
if
(st ==
false
&& i == 0)
{
val = 1;
}
Tuple<
long
,
string
> temp = Recur(l, r, pos + 1, ta && (i == start), tb && (i == end), st || i > 0);
if
(temp.Item1 * val > ans)
{
ans = temp.Item1 * val;
if
(i == 0 && st ==
false
)
{
s = temp.Item2;
}
else
{
s = temp.Item2;
s += Convert.ToChar(
'0'
+ i);
}
}
}
dp[pos, ta ? 1 : 0, tb ? 1 : 0, st ? 1 : 0] = ans;
return
Tuple.Create<
long
,
string
>(ans, s);
}
static
Tuple<
long
,
string
> Solve(
int
a,
int
b)
{
string
L = a.ToString();
string
R = b.ToString();
if
(L.Length < R.Length)
{
char
[] lArr = L.ToCharArray();
Array.Reverse(lArr);
L =
new
string
(lArr);
while
(L.Length < R.Length)
{
L +=
"0"
;
}
lArr = L.ToCharArray();
Array.Reverse(lArr);
L =
new
string
(lArr);
}
for
(
int
i = 0; i < 20; i++)
{
for
(
int
j = 0; j < 2; j++)
{
for
(
int
k = 0; k < 2; k++)
{
for
(
int
l = 0; l < 2; l++)
{
dp[i,j,k,l] = -1;
}
}
}
}
Tuple<
long
,
string
> ans = Recur(L, R, 0,
true
,
true
,
false
);
char
[] ansArr = ans.Item2.ToCharArray();
Array.Reverse(ansArr);
ans = Tuple.Create<
long
,
string
>(ans.Item1,
new
string
(ansArr));
return
ans;
}
public
static
void
Main()
{
int
l = 52, r = 62;
Console.WriteLine(
"l= "
+ l);
Console.WriteLine(
"r= "
+ r);
Tuple<
long
,
string
> ans = Solve(l, r);
Console.WriteLine(
"Maximum Product: "
+ ans.Item1);
Console.WriteLine(
"Number which gave maximum product: "
+ ans.Item2);
}
}