n=int(input())
ans=[0]*10
add=0
i=1
while n!=0:
c=n%10
n//=10
ans[0]-=i
for j in range(c):ans[j] += (n+1)*i
ans[c] += n*i+1+add
for j in range(c+1,10):ans[j] += n*i
add+=c*i
i*=10
print(" ".join(map(str,ans)))
해당 코드는 숫자를 가장 낮은 자릿수(일의 자리)부터 하나씩 처리하며 올라간다. 각 자릿수를 처리할 때마다 해당 자릿수에 0부터 9까지의 숫자가 몇 번 나타나는지를 계산하여 ans 배열에 누적한다.
i는 현재 자릿수, c는 현재 자릿수의 숫자이다. 그리고 다음 자릿수를 처리하기 위해 n을 업데이트한다.
ans[0]-=i
1~N까지 세는 과정에서 불필요하게 포함된 맨 앞자리 0들을 빼준다.
for j in range(c):
ans[j] += (n+1)*i
현재 자릿수(c)보다 작은 숫자(0 ~ c-1)의 개수를 계산한다.
ans[c] += n*i+1+add
현재 자릿수(c)와 같은 숫자의 개수 계산
for j in range(c+1,10):
ans[j] += n*i
현재 자릿수(c)보다 큰 숫자(c+1 ~ 9)의 개수 계산