BOJ : https://www.acmicpc.net/problem/2410
github : https://github.com/junho0956/Algorithm/blob/master/2410/2410/%EC%86%8C%EC%8A%A4.cpp
19년도 부산 코딩경시대회에 3번으로 나왔던 문제이다.
그때도 이렇게 풀었었는데 복습할겸 풀어보았다.
2의 멱수로 만들수있는 모든 경우의 수를 구할려면
첫 값을 현재 제곱수로 빼보느냐 안빼보느냐로 구분지어서 문제를 해결할 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
#include <iostream>
#include <cmath>
#include <algorithm>
#define MOD 1000000000
using namespace std;
int N;
int dp[1000001][20];
int ans(int num, int p) {
if (num == 0) {
return 1;
}
if (num < 0 || p < 0) return 0;
if (dp[num][p]) return dp[num][p];
// 현재 값에 대해 2^p 만큼 쓰거나 안쓰고 1로만 쓰거나 둘중하나
dp[num][p] = ans(num - pow(2, p), p)%MOD + ans(num, p-1)%MOD;
return dp[num][p];
}
int main() {
cin >> N;
cout << ans(N, 19) % MOD;
return 0;
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
|
복습 20.02.08
'algorithm > BOJ' 카테고리의 다른 글
BOJ 1697번 숨바꼭질 (0) | 2020.01.22 |
---|---|
BOJ 10819번 차이를 최대로 (0) | 2020.01.22 |
BOJ 1451번 직사각형으로 나누기 (0) | 2020.01.21 |
BOJ 1107번 리모컨 (0) | 2020.01.21 |
BOJ 1476번 날짜 계산 (0) | 2020.01.17 |