给定一个N*M的矩阵,记录左上角为(1,1),右下角为(N,M),现在从(1,1)开始取数,每次只能向下或向右移动一个单位,最终到达(N,M),我们把路径上所有的数相乘,记为C。使C的结果最大已经不能满足我们了,现在我们想让C末尾的零最少。
Ps.11000末尾有3个零,100000100末尾有2个零。
我们只要把输入的数分解成2和5,把2和5的数量记录下来,两幅图中找一条最小路径之后就OK了。
var
i,j,n,m,k,l:longint;
a,b,c:array[0..1000,0..1000] of int64;
function min(x,y:longint):longint;
begin
if x>y then min:=y
else min:=x;
end;
procedure main;
begin
readln(n,m);
for i:=1 to n do
for j:=1 to m do
read(a[i,j]);
for i:=1 to n do
for j:=1 to m do
begin
k:=a[i,j];l:=0;
while k mod 2=0 do
begin
k:=k div 2;
inc(l);
end;
b[i,j]:=l;
k:=a[i,j];l:=0;
while k mod 5=0 do
begin
k:=k div 5;
inc(l);
end;
c[i,j]:=l;
end;
end;
begin
main;
for i:=1 to n do
begin
b[i,0]:=maxlongint;
c[i,0]:=maxlongint;
end;
for i:=1 to m do
begin
b[0,i]:=maxlongint;
c[0,i]:=maxlongint;
end;
for i:=1 to n do
for j:=1 to m do
if (i<>1)or(j<>1) then
b[i,j]:=b[i,j]+min(b[i-1,j],b[i,j-1]);
for i:=1 to n do
for j:=1 to m do
if (i<>1)or(j<>1) then
c[i,j]:=c[i,j]+min(c[i-1,j],c[i,j-1]);
writeln(min(c[n,m],b[n,m]))
end.