글 작성자: Sowhat_93

N자리 계단수에 대해

끝자리가 1 - N-1자리 계단수의 끝자리가 0,2 

끝자리가 2 - N-1자리 계단수의 끝자리가 1,3 

끝자리가 3 - N-1자리 계단수의 끝자리가 2,4 

끝자리가 4 - N-1자리 계단수의 끝자리가 3,5 

끝자리가 5 - N-1자리 계단수의 끝자리가 4,6 

끝자리가 6 - N-1자리 계단수의 끝자리가 5,7 

끝자리가 7 - N-1자리 계단수의 끝자리가 6,8 

끝자리가 8 - N-1자리 계단수의 끝자리가 7,9 

끝자리가 9 - N-1자리 계단수의 끝자리가 8 

끝자리가 0 - N-1자리 계단수의 끝자리가 1 

 

모듈러 연산은 합에대한 분배법칙이 성립함에 유의하면 쉽게 풀어낼 수 있는 문제이다.

#include <iostream>

unsigned long long LastNumberCounts[101][10];

int main()
{

	int N;

	std::cin >> N;

	LastNumberCounts[1][0] = 0;
	for (int i = 2; i < 10; ++i) LastNumberCounts[1][i] = 1;

	for (int i = 2; i <= N; ++i)
	{
		LastNumberCounts[i][0] =	LastNumberCounts[i - 1][1] % 1000000000;
		LastNumberCounts[i][9] =	LastNumberCounts[i - 1][8] % 1000000000;

		for (int k = 1; k < 9; ++k)
			LastNumberCounts[i][k] = (LastNumberCounts[i-1][k-1] + LastNumberCounts[i-1][k + 1]) % 1000000000;
	}

	unsigned long long Res = 0;

	for (int i = 0; i <= 9; ++i)
		Res = (Res + LastNumberCounts[N][i]) % 1000000000;

	std::cout << Res << std::endl;


}