Мы не ищем легких путей, мы ищем изящные

[syntax='Delphi']
const k=...;
n=...;
function pow10(n: byte): longint;
var i: byte;
begin pow10:=1; for i:=1 to n do pow10:=pow10*10; end;
var sum,j: byte; i, count: longint;
begin
sum:=1; //У любого наименьшего n-значного числа сумма цифр всегда 1.
count:=0;
for i:=pow10(n) to pow10(n+1)-1 do begin
for j:=n-1 downto 1
if i mod pow10(j)=0 then begin dec(sum, 9*j-1); break; end;
if i mod 10<>0 then inc(sum);
if sum=k then inc(count);
end;
writeln(count);
end.
[/syntax]
Как это работает: обычно при переходе к следующему числу сумма цифр увеличивается на 1, но если мы переходим на новую десятку, то последняя девятка становится нулем, а цифра десяток увеличивается на 1, т.е. сумма уменьшается на 9 и увеличивается на 1. Соответственно, если мы переходим через сотню, то две девятки становятся нулями и увеличивается на 1 число сотен, и т.д.
Код писался на коленке, компилировать не пробовал.