TCDFZ - Chữ số tận cùng khác 0

Tác giả: RR

Ngôn ngữ: Pascal

var
  nn,i,n,res,lt2,lt5:longint;
  t1:array[0..10] of longint;

function powInFac(n,k:longint):longint;
    begin
      if n<k then exit(0);
      exit(n div k+powInFac(n div k,k));
    end;

function power(a,k:longint):longint;
    var
      mid:longint;
    begin
      if k=0 then exit(1);
      if k=1 then exit(a);
      mid:=power(a,k shr 1);
      mid:=(mid*mid) mod 10;
      if k and 1=0 then exit(mid)
      else exit((mid*a) mod 10);
    end;

function get(n:longint):longint;
    var
      res:longint;
    begin
      res:=1;
      while (n>0) do
        begin
          res:=(res*power(t1[9],n div 10)*t1[n mod 10]) mod 10;
          n:=n shr 1;
        end;
      exit(res);
    end;

begin
  t1[0]:=1;
  for i:=1 to 9 do
    if (i and 1=1) and (i<>5) then t1[i]:=t1[i-1]*i
    else t1[i]:=t1[i-1];

  read(n); nn:=n;
  lt2:=powInFac(n,2);
  lt5:=powInFac(n,5);
  res:=power(2,lt2-lt5);
  res:=(res*get(n)) mod 10;

  n:=nn div 5;
  while (n>0) do
    begin
      res:=(res*get(n)) mod 10;
      n:=n div 5;
    end;
  writeln(res);
end.

Download