#include <string>
#include <vector>
#include <iostream>
using namespace std;
long long d[92][2];
int N;
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cin >> N;
d[1][1] = 1;
d[2][0] = 1;
d[3][0] = 1; d[3][1] = 1;
for(int i=4;i<=N;i++)
{
d[i][0] = d[i-1][0] + d[i-1][1];
d[i][1] = d[i-1][0];
}
cout << d[N][0] + d[N][1];
return 0;
}
- 테이블 정의
D[i][0] = i 자리수 2진수 중 0으로 끝나는 요소의 개수
D[i][1] = i 자리수 2진수 중 1으로 끝나는 요소의 개수
- 점화식
D[i][0] = D[i-1][0] + D[i-1][1]
D[i][1] = D[i-1][0]
- 점화식 이해하기
ex)
i
가 4일 경우 1000
/ 1010
/ 1001
이렇게 3가지 가 나오는데,
끝이 0인 요소는 뒤에 0과 1을 추가할 수 있으며,
끝이 1인 요소는 뒤에 0만 추가해야한다.
즉, 1000
-> 10000
/ 10001
1010
-> 10100
/ 10101
1001
-> 10010
이 된다!
결과적으로,
D[5][0]
은 D[4][0] + D[4][1]
(끝이 0이 되는 것 = 전 자리수의 0요소 개수 + 전 자리수 1의 개수)
D[5][1]
은 D[4][0]
(끝이 1이 되는 것 = 전 자리수의 0요소 개수)