Skip to content

Commit

Permalink
2410. 2의 멱수의 합 - DP
Browse files Browse the repository at this point in the history
  • Loading branch information
mwy3055 committed Jun 1, 2023
1 parent aaff4c3 commit b1a03ea
Showing 1 changed file with 64 additions and 0 deletions.
64 changes: 64 additions & 0 deletions baekjoon/cpp/c++/2410.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
#include <bits/stdc++.h>

const int MOD = 1e9;

int n;
int dp[1000001][21], mlog[1000001];

void getinput()
{
std::cin >> n;
}

void init()
{
for (int i = 0; i <= 20; i++)
{
if ((1 << i) <= 1000000)
{
mlog[1 << i] = i;
}
}

for (int i = 1; i <= 1000000; i++)
{
if (mlog[i] == 0)
{
mlog[i] = mlog[i - 1];
}
}
}

int solve(int n, int sq)
{
if (n == 0)
return 1;
auto &ret = dp[n][sq];
if (ret != -1)
return ret;

ret = 0;
for (int i = std::min(sq, mlog[n]); i >= 0; i--)
{
auto tans = solve(n - (1 << i), i);
ret = (ret + tans) % MOD;
}
return ret;
}

int solve()
{
std::memset(dp, -1, sizeof(dp));
init();

return solve(n, mlog[n]);
}

int main()
{
std::ios::sync_with_stdio(false);
std::cin.tie(0);

getinput();
std::cout << solve() << '\n';
}

0 comments on commit b1a03ea

Please sign in to comment.