Cod sursa(job #82247)

Utilizator gurneySachelarie Bogdan gurney Data 6 septembrie 2007 00:11:26
Problema Cifre Scor 100
Compilator fpc Status done
Runda Arhiva de probleme Marime 4.11 kb
program cifre;
  const
    fin='cifre.in';
    fout='cifre.out';
var
  s:string;
  d,z,a,b,c,k,i,j,n,x,y:longint;
  mare:boolean;

function f(x:longint):longint;
  var
    s,lg,a,b,nr,i:longint;
    st,aa:array[0..20] of longint;
    procedure back(num:longint;mare:boolean;poz:boolean);
      var
        x,i:longint;
      begin
        if st[num-1]>0 then
        if (num=lg+1)and(nr>=k) then
          begin
            x:=1;
            for i:=1 to lg do
              x:=x*st[i];
            inc(s,x);
          end
        else if (num<lg+1) then
          begin
            if mare=true then
              begin
                inc(nr);
                st[num]:=1;
                if c=0 then
                  begin
                  if poz then
                    back(num+1,true,true)
                  else
                    begin
                      dec(nr);
                      back(num+1,true,false);
                      inc(nr);
                    end;
                  end
                  else
                    back(num+1,true,true);
                dec(nr);
                st[num]:=9;
                back(num+1,true,true);
              end
            else
              begin
                if c<aa[num] then
                  begin
                    st[num]:=1;
                    if c=0 then
                      begin
                        if poz then
                          begin
                            inc(nr);
                            back(num+1,true,true);
                            dec(nr);
                          end
                        else
                          back(num+1,true,false);
                        st[num]:=1;back(num+1,false,true);
                        st[num]:=aa[num]-1;back(num+1,true,true);
                      end
                    else
                      begin
                        inc(nr);
                        st[num]:=1;back(num+1,true,true);
                        dec(nr);
                        st[num]:=1;back(num+1,false,true);
                        st[num]:=aa[num]-1;back(num+1,true,true);
                      end;
                  end
                else if c=aa[num] then
                  begin
                    if c=0 then
                      begin
                        st[num]:=1;
                        if poz then
                          begin
                            inc(nr);
                            back(num+1,false,true);
                            dec(nr);
                          end
                        else
                          back(num+1,false,false);
                      end
                    else
                      begin
                        inc(nr);
                        st[num]:=1;back(num+1,false,true);
                        dec(nr);
                        st[num]:=aa[num];
                        back(num+1,true,true);
                      end;
                  end
                else
                  begin
                    st[num]:=1;back(num+1,false,true);
                    st[num]:=aa[num];back(num+1,true,true);
                  end;
              end;
          end;
      end;

  begin
    if (x<>-1)and(x<>0) then
      begin
        a:=x;lg:=0;
        while a>0 do
          begin
            a:=a div 10;
            inc(lg);
          end;
        for i:=lg downto 1 do
          begin
            aa[i]:=x mod 10;
            x:=x div 10;
          end;
        s:=0;nr:=0;
        st[0]:=1;
        back(1,false,false);
        f:=s;
        end
        else
      begin
        if x=-1 then
          f:=0
        else if x=0 then
          begin
            if (c=0) and (k<=1) then
              f:=1
            else
              f:=0;
          end;
      end;
  end;

begin
assign(input,fin);
  reset(input);
  readln(a,b,c,k);
close(input);
assign(output,fout);
  rewrite(output);
  x:=(f(b)-f(a-1));
  if (c=0) and (k>=0) then
    if a=0 then
      inc(x);
  y:=(b-a+1);
  writeln(x/y:0:4);
close(output);
end.