Advertisement
coderchesser

radioactive

Jan 29th, 2024
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.99 KB | Source Code | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <cstring>
  4. #include <unordered_map>
  5. # define int long long
  6. using namespace std;
  7.  
  8. const int MOD = 1000000007;
  9. unordered_map<int, int> dp;
  10.  
  11. int countWays(int N, int C) {
  12.     if (dp.find(N) != dp.end()) return dp[N];
  13.  
  14.     if (N % 2 == 0) {
  15.         int answer = 0;
  16.         int dpArray[C + 1];
  17.         memset(dpArray, 0, sizeof dpArray);
  18.  
  19.         for (int i = 0; i <= min(N / 2 + 1, C); i++) {
  20.             if (i == N / 2) {
  21.                 dpArray[i] = 1;
  22.             } else {
  23.                 dpArray[i] = countWays(N / 2 - i - 1, C);
  24.             }
  25.         }
  26.        
  27.         int curr = dpArray[0];
  28.         for (int i = C; i >= 0; i--) {
  29.             answer = (answer + dpArray[i] * curr) % MOD;
  30.             curr = (curr + dpArray[C - i + 1]) % MOD;
  31.         }
  32.  
  33.         return dp[N] = answer;
  34.     }
  35.     else {
  36.         int answer = 0;
  37.         int dpArray[C + 2];
  38.         memset(dpArray, 0, sizeof dpArray);
  39.         dpArray[0] = countWays(N / 2, C);
  40.         for (int i = 1; i <= min(N / 2, C) + 1; i++) {
  41.             if (i == N / 2 + 1) {
  42.                 dpArray[i] = 1;
  43.             }
  44.             else {
  45.                 dpArray[i] = countWays(N / 2 - i, C);
  46.             }
  47.         }
  48.  
  49.         int curr = dpArray[0];
  50.         for (int i = C; i >= 0; i--) {
  51.             answer = (answer + dpArray[i + 1] * curr) % MOD;
  52.             curr = (curr + dpArray[C - i + 1]) % MOD;
  53.         }
  54.         return dp[N] = answer;
  55.     }
  56. }
  57.  
  58. signed main() {
  59.     int N, C;
  60.     cin >> N >> C;
  61.  
  62.     if (N <= C) {
  63.         int ways = 1;
  64.         for (int i = 0; i < N; ++i) {
  65.             ways = (2 * ways) % MOD;
  66.         }
  67.         cout << ways << endl;
  68.     } else {
  69.         if (N == 0) {
  70.             cout << 1 << endl;
  71.         } else {
  72.             if (N == 1) {
  73.                 cout << 2 << endl;
  74.             } else {
  75.                 int ways = countWays(N, C);
  76.                 cout << ways << endl;
  77.             }
  78.         }
  79.     }
  80.  
  81.     return 0;
  82. }
  83.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement