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 < 0return 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

+ Recent posts