Cod sursa(job #82247)
Utilizator | 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.