# 오르막 수 import sys input = sys.stdin.readline def solution(): n = int(input().rstrip()) dp = [1]*10 for _ in range(1, n): temp = dp[-1] dp[-1] = sum(dp) for i in range(8, -1, -1): temp2 = dp[i] dp[i] = dp[i+1] - temp temp = temp2 print(sum(dp)%10007) return solution() """ 걸린 시간: 50분 시간 복잡도: 10자리의 dp 테이블을 n번만큼 반복하며 업데이트하기 때문에 O(10n)이다. 해설: 한 자리수 일때는 0~9까지 그냥 10개이다. 두 자리수 일때는 0일때 0~9, 1일때 1~9 ... 로 10개부터 1개까지 다 더한 55개이다. 세 자리수 일때는 0--일때, 55개, 1--일때, 11부터 99까지이므로 1~9 ... 1~1까지 45개이므로, 두 자리수 기준으로 0~9일때, 1~9일때.. 경우의 수를 가져온다. 그렇다는것은 자리수가 늘어날수록 10개의 수 기준으로 합이 정답이 된다는 뜻이다. 따라서 dp = [1]*10으로 해놓고, 자리수가 늘어날수록 합을 계속 계산하면 된다. 나는 논리 그대로 55에서 10을 빼고, 45에서 9를 빼고.. 순서로 가다보니 dp를 뒤에서부터 채우느라 temp가 2개 등장했지만, 사실 이게 앞에서부터 누적합을 계산하는 것이랑 똑같다. 수식으로 이해해보자면, dp[i][j]를 i자리수의 끝 숫자가 j일때 경우의 수로 생각해보면, dp[i][j] = dp[i-1][0] + dp[i-1][1] + .. + dp[i-1][j]이다. 이건 결국 전 행의 누적합을 의미한다. 또한 dp[i][j-1] = dp[i][0] + .. + dp[i][j-1]이므로, dp[i][j] = dp[i][j-1] + dp[i-1][j]가 된다. 따라서 1차원으로 만들면 dp[i] = dp[i-1] + dp[i](이전)이 된다. """