Advertisement
Kevin_Zhang

Untitled

Mar 22nd, 2021 (edited)
715
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.26 KB | None | 0 0
  1. #pragma GCC optimize("Ofast")
  2.  
  3. #include <bits/stdc++.h>
  4. using namespace std;
  5. using ll = long long;
  6. #define pb emplace_back
  7. #define AI(i) begin(i), end(i)
  8. template<class T> bool chmin(T &a, T b) { return b < a && (a = b, true); }
  9. template<class T> bool chmax(T &a, T b) { return a < b && (a = b, true); }
  10. #ifdef KEV
  11. #define DE(args...) kout("[ " + string(#args) + " ] = ", args)
  12. void kout() { cerr << endl; }
  13. template<class T, class ...U> void kout(T a, U ...b) { cerr << a << ' ', kout(b...); }
  14. template<class T> void debug(T l, T r) { while (l != r) cerr << *l << " \n"[next(l)==r], ++l; }
  15. #else
  16. #define DE(...) 0
  17. #define debug(...) 0
  18. #endif
  19.  
  20. const int MAX_N = 20001, inf = 1e9 + 10, MAX_1 = 25, MAX_MOD = 500;
  21.  
  22. // M is cnt0, N is cnt1
  23. int m, n, k, R;
  24.  
  25. //     cnt1   cnt0 , mod
  26. int dp[MAX_1][MAX_N][MAX_MOD], modv[MAX_N << 1];
  27.  
  28. void add(int &a, int b) { a = min(inf, a + b); }
  29.  
  30. // cause cnt0 is so small
  31. // dp[ cnt0 ][ cnt1 ][ mod ]
  32. int bfsolve() {
  33.     modv[0] = 1;
  34.     for (int i = 1;i <= n + m;++i)
  35.         modv[i] = modv[i-1] * 2 % k;
  36.  
  37.     dp[0][0][0] = 1;
  38.  
  39.     for (int i = 0;i <= m;++i)
  40.         for (int j = 0;j <= n;++j) {
  41.  
  42.             for (int mv = 0;mv < k;++mv) if (dp[i][j][mv]) {
  43.                 //DE(i, j, mv, dp[i][j][mv]);
  44.                 add(dp[i][j+1][ (modv[i+j] + mv) % k],  dp[i][j][mv]);
  45.                 add(dp[i+1][j][ mv ], dp[i][j][mv]);
  46.             }
  47.  
  48.        
  49.         }
  50.  
  51.     int l0 = m, l1 = n-1, cmod = (k - modv[l0 + l1]) % k;
  52.  
  53.     string res = "1";
  54.  
  55.     if (dp[l0][l1][cmod] < R) return puts("impossible"), 0;
  56.  
  57.     for (int len = l0 + l1 - 1;len >= 0;--len) {
  58.         //DE(R, l0, l1, cmod, dp[l1][l0][cmod]);
  59.  
  60.         int way0 = 0, way1 = 0;
  61.         if (l0) {
  62.             way0 = dp[l0-1][l1][cmod];
  63.         }
  64.         if (l1) {
  65.             int nmod = (cmod + k - modv[len]) % k;
  66.             way1 = dp[l0][l1-1][nmod];
  67.         }
  68.  
  69.         //DE(way0, way1);
  70.  
  71.         if (way1 >= R) {
  72.             res.push_back('1');
  73.             cmod = (cmod + k - modv[len]) % k;
  74.             --l1;
  75.         }
  76.         else {
  77.             R -= way1;
  78.             res.push_back('0');
  79.             --l0;
  80.         }
  81.     }
  82.  
  83.     cout << res << '\n';
  84.  
  85.     return 0;
  86. }
  87. int32_t main() {
  88.     ios_base::sync_with_stdio(0), cin.tie(0);
  89.  
  90.     DE(sizeof(dp) / 1000000);
  91.  
  92.     cin >> m >> n >> k >> R;
  93.  
  94.     if (m < MAX_1) {
  95.         bfsolve();
  96.         return 0;
  97.     }
  98.  
  99.     modv[0] = 1;
  100.     for (int i = 1;i <= n + m;++i)
  101.         modv[i] = modv[i-1] * 2 % k;
  102.  
  103.     dp[0][0][0] = 1;
  104.  
  105.  
  106.     int lim = min(n, MAX_1 - 2);
  107.  
  108.     for (int i = 0;i <= lim;++i)
  109.         for (int j = 0;j <= m;++j) {
  110.  
  111.             for (int mv = 0;mv < k;++mv) if (dp[i][j][mv]) {
  112.                 DE(i, j, mv, dp[i][j][mv]);
  113.                 add(dp[i+1][j][ (modv[i+j] + mv) % k],  dp[i][j][mv]);
  114.                 add(dp[i][j+1][ mv ], dp[i][j][mv]);
  115.             }
  116.  
  117.        
  118.         }
  119.  
  120.     int l0 = m, l1 = n-1, cmod = (k - modv[l0 + l1]) % k;
  121.  
  122.     string res = "1";
  123.  
  124.     while (l1 > lim) {
  125.         res.push_back('1');
  126.         cmod = (cmod + k - modv[l0 + l1 - 1]) % k;
  127.         --l1;
  128.     }
  129.  
  130.     if (dp[l1][l0][cmod] < R) return puts("impossible"), 0;
  131.     DE(dp[l1][l0][cmod]);
  132.  
  133.     for (int len = l0 + l1 - 1;len >= 0;--len) {
  134.         DE(R, l0, l1, cmod, dp[l1][l0][cmod]);
  135.  
  136.         int way0 = 0, way1 = 0;
  137.         if (l0) {
  138.             way0 = dp[l1][l0-1][cmod];
  139.         }
  140.         if (l1) {
  141.             int nmod = (cmod + k - modv[len]) % k;
  142.             way1 = dp[l1-1][l0][nmod];
  143.         }
  144.  
  145.         DE(way0, way1);
  146.  
  147.         if (way1 >= R) {
  148.             res.push_back('1');
  149.             cmod = (cmod + k - modv[len]) % k;
  150.             --l1;
  151.         }
  152.         else {
  153.             R -= way1;
  154.             res.push_back('0');
  155.             --l0;
  156.         }
  157.     }
  158.  
  159.     cout << res << '\n';
  160. }
  161.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement