Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <cstring>
- #include <unordered_map>
- # define int long long
- using namespace std;
- const int MOD = 1000000007;
- unordered_map<int, int> dp;
- int countWays(int N, int C) {
- if (dp.find(N) != dp.end()) return dp[N];
- if (N % 2 == 0) {
- int answer = 0;
- int dpArray[C + 1];
- memset(dpArray, 0, sizeof dpArray);
- for (int i = 0; i <= min(N / 2 + 1, C); i++) {
- if (i == N / 2) {
- dpArray[i] = 1;
- } else {
- dpArray[i] = countWays(N / 2 - i - 1, C);
- }
- }
- int curr = dpArray[0];
- for (int i = C; i >= 0; i--) {
- answer = (answer + dpArray[i] * curr) % MOD;
- curr = (curr + dpArray[C - i + 1]) % MOD;
- }
- return dp[N] = answer;
- }
- else {
- int answer = 0;
- int dpArray[C + 2];
- memset(dpArray, 0, sizeof dpArray);
- dpArray[0] = countWays(N / 2, C);
- for (int i = 1; i <= min(N / 2, C) + 1; i++) {
- if (i == N / 2 + 1) {
- dpArray[i] = 1;
- }
- else {
- dpArray[i] = countWays(N / 2 - i, C);
- }
- }
- int curr = dpArray[0];
- for (int i = C; i >= 0; i--) {
- answer = (answer + dpArray[i + 1] * curr) % MOD;
- curr = (curr + dpArray[C - i + 1]) % MOD;
- }
- return dp[N] = answer;
- }
- }
- signed main() {
- int N, C;
- cin >> N >> C;
- if (N <= C) {
- int ways = 1;
- for (int i = 0; i < N; ++i) {
- ways = (2 * ways) % MOD;
- }
- cout << ways << endl;
- } else {
- if (N == 0) {
- cout << 1 << endl;
- } else {
- if (N == 1) {
- cout << 2 << endl;
- } else {
- int ways = countWays(N, C);
- cout << ways << endl;
- }
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement