cheater2k

~K Perm Counting - AtCoder Grand Contest 005

Nov 22nd, 2017
195
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.31 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. const int N = 2005;
  5. const int md = 924844033;
  6.  
  7. int n, k;
  8. int c[N];
  9. int f[N][N][2][2];
  10.  
  11. void add(int &x, int y) { x += y; while(x >= md) x -= md; if (x < 0) x += md; }
  12.  
  13. int main() {
  14.     ios_base::sync_with_stdio(false); cin.tie(0);
  15.     cin >> n >> k;
  16.     for (int i = 0; i < k; ++i) c[i] = (n - 1) / k;
  17.     for (int i = 0; i <= (n - 1) % k; ++i) ++c[i];
  18.  
  19.     int pos = 1;
  20.     int cmd = 0;
  21.     f[0][0][0][0] = 1;
  22.     for (int i = 0; i < n; ++i) {
  23.         for (int rem = 0; rem <= i; ++rem) for (int rem_i = 0; rem_i < 2; ++rem_i) for (int rem_pi = 0; rem_pi < 2; ++rem_pi) {
  24.             if (!f[i][rem][rem_i][rem_pi]) continue;
  25.  
  26.             int r0 = rem_i, r1 = rem_pi;
  27.             if (i + 1 == pos) r0 = 0, r1 = 0;
  28.  
  29.             add(f[i + 1][rem][0][1], 1ll * (rem - r1) * f[i][rem][rem_i][rem_pi] % md);
  30.             add(f[i + 1][rem][1][0], 1ll * (rem - r0) * f[i][rem][rem_i][rem_pi] % md);
  31.             add(f[i + 1][rem][0][0], f[i][rem][rem_i][rem_pi] % md);
  32.             add(f[i + 1][rem + 1][1][1], f[i][rem][rem_i][rem_pi] % md);
  33.             if (rem > 0) add(f[i + 1][rem - 1][0][0], 1ll * (rem - r0) * (rem - r1) * f[i][rem][rem_i][rem_pi] % md);
  34.         }
  35.         if (i + 1 == pos) {
  36.             pos += c[cmd]; ++cmd;
  37.         }
  38.     }
  39.  
  40.     int ans = 0;
  41.     for (int r0 = 0; r0 < 2; ++r0) for (int r1 = 0; r1 < 2; ++r1) {
  42.         add(ans, f[n][0][r0][r1]);
  43.     }
  44.  
  45.     cout << ans << endl;
  46. }
Advertisement
Add Comment
Please, Sign In to add comment