MDIGITS - Counting Digits
Tác giả: flashmt
Ngôn ngữ: Pascal
var a,b,i:longint;
d,c:array[0..9] of longint;
z:array[1..8] of longint;
procedure calc(m,n,k:longint);
var p,q,t,u,j,l:longint; s:string;
begin
if m=n then
begin
str(n,s);
for j:=1 to length(s) do
inc(d[ord(s[j])-48]);
exit;
end;
if k=0 then
begin
for j:=m to n do
begin
str(j,s);
for t:=1 to length(s) do
inc(d[ord(s[t])-48]);
end;
exit;
end;
if m mod c[k] = 0 then p:=m
else p:=m+c[k]-m mod c[k];
inc(n);
q:=n-n mod c[k];
dec(n);
if p>=q then calc(m,n,k-1)
else
begin
t:=p div c[k];
u:=q div c[k];
for j:=0 to 9 do
d[j]:=d[j]+c[k-1]*k*(u-t);
for j:=t to u-1 do
begin
str(j,s);
for l:=1 to length(s) do
inc(d[ord(s[l])-48],c[k]);
end;
if m<p then calc(m,p-1,k-1);
if q<n+1 then calc(q,n,k-1);
end;
end;
begin
c[0]:=1;
fillchar(d,sizeof(d),0);
for i:=1 to 8 do c[i]:=c[i-1]*10;
z[1]:=9;
for i:=2 to 8 do z[i]:=z[i-1]*10;
repeat
readln(a,b);
if (a+b=0) then break;
if a>b then
begin
a:=a+b;
b:=a-b;
a:=a-b;
end;
fillchar(d,sizeof(d),0);
calc(a,b,7);
for i:=0 to 9 do write(d[i],' ');
writeln;
until false;
end.