Cod sursa(job #228302)

Utilizator radu_voroneanuVoroneanu Radu Stefan radu_voroneanu Data 6 decembrie 2008 22:01:54
Problema Cifre Scor 90
Compilator fpc Status done
Runda Arhiva de probleme Marime 1.9 kb
var nr,nr0:array[-10..10,-10..10] of longint;
    f,g:text;
    v:array[0..100] of longint;
    nr1,i,j,a,b,c,k:longint;
    rez:real;

function max(x,y:longint):longint;
 begin
  if x>y then max:=x
  else
   max:=y;
 end;

function fu(x:longint):longint;
 var s:longint;
 begin
  v[0]:=0;
  nr1:=0;
  if x=0 then
   nr1:=1;
  while x<>0 do begin
   inc(v[0]);
   v[v[0]]:=x mod 10;
   x:=x div 10;
  end;
  for i:=1 to v[0] shr 1 do begin
   s:=v[i];
   v[i]:=v[v[0]-i+1];
   v[v[0]-i+1]:=s;
  end;
  s:=0;
  for i:=1 to v[0] do begin
   if c>=1 then begin
    if v[i]>c then begin
     s:=s+nr[v[0]-i,max(k-nr1,0)]*(v[i]-1);
     s:=s+nr[v[0]-i,max(k-nr1-1,0)];
    end;
    if v[i]=c then begin
     s:=s+nr[v[0]-i,max(k-nr1,0)]*v[i];
     inc(nr1);
    end;
    if v[i]<c then
     s:=s+nr[v[0]-i,max(k-nr1,0)]*v[i];
   end;
   if c=0 then begin
    if v[i]>c then begin
     s:=s+nr[v[0]-i,max(k-nr1,0)]*(v[i]-1);
     if i<>1 then
      s:=s+nr0[v[0]-i,max(k-nr1-1,0)]
     else
      s:=s+nr0[v[0]-i,k];
    end;
    if v[i]=c then begin
     s:=s+nr[v[0]-i,max(k-nr1-1,0)]*v[i];
     inc(nr1);
    end;
    if v[i]<c then
     s:=s+nr[v[0]-i,max(k-nr1,0)]*v[i];
   end;
  end;
  if nr1>=k then
   s:=s+1;
  fu:=s;
 end;

begin
 assign(f,'cifre.in'); reset(f);
 assign(g,'cifre.out'); rewrite(g);
 read(f,a,b,c,k);
 nr[1,1]:=1;
 nr[0,0]:=1;
 for i:=1 to 9 do
  nr[i,0]:=nr[i-1,0]*10;
 for i:=2 to 9 do begin
  for j:=1 to 9 do
   nr[i,j]:=nr[i-1,j]*9+nr[i-1,j-1];
 end;
 nr0[1,1]:=1;
 for i:=2 to 9 do
  for j:=1 to 9 do
   if c=0 then
    nr0[i,j]:=nr0[i-1,j]+9*nr[i-1,j]
   else
    nr0[i,j]:=nr0[i-1,j]+8*nr[i-1,j]+nr[i-1,j-1];
 nr0[0,0]:=1;
 nr0[0,1]:=1;
 nr0[1,0]:=9;
 for i:=2 to 9 do
  nr0[i,0]:=nr0[i-1,0]*10;
 rez:=fu(b)-fu(a-1);
 rez:=rez/(b-a+1);
 rez:=trunc(rez*10000);
 rez:=rez/10000;
 writeln(g,rez:0:4);
 close(f); close(g);
end.