Advertisement
_rashed

SPOJ PERMUT1

Jul 4th, 2022
50
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.18 KB | None | 0 0
  1. #define ll long long
  2. #include <bits/stdc++.h>
  3. using namespace std;
  4.  
  5. const int OO = 1e9;
  6. const double EPS = 1e-9;
  7.  
  8. ll n,k,mem[(1 << 12)][100];
  9.  
  10. ll solve(bitset<12> msk, int inv) {
  11.     //cout << "here at msk = " << msk.to_ullong() << " inv = " << inv << "\n";
  12.     int idx = msk.count();
  13.     if(idx == n) {
  14.         return (inv == k);
  15.     }
  16.     if(mem[msk.to_ullong()][inv] != -1) {
  17.         return mem[msk.to_ullong()][inv];
  18.     }
  19.     ll &ret = mem[msk.to_ullong()][inv];
  20.     ret = 0;
  21.     int pre[12];
  22.     for(int i = 0; i < n; i++) {
  23.         pre[i] = msk[i] + (i > 0 ? pre[i-1]:0);
  24.     }
  25.     for(int i = 0; i < n; i++) {
  26.         if(!msk[i]) {
  27.             bitset<12> cp = msk;
  28.             cp[i] = 1;
  29.             ret += solve(cp,min(99,pre[n-1]-pre[i]+inv));
  30.         }
  31.     }
  32.     return ret;
  33. }
  34.  
  35. int main()
  36. {
  37.     ios_base::sync_with_stdio(false);
  38.     cin.tie(NULL);
  39.     cout.tie(NULL);
  40.     int d;
  41.     cin >> d;
  42.     while(d--) {
  43.         cin >> n >> k;
  44.         for(int i = (1 << 12)-1; i >= 0; i--) {
  45.             for(int j = 0; j < 100; j++) {
  46.                 mem[i][j] = -1;
  47.             }
  48.         }
  49.         cout << solve(bitset<12>(),0) << "\n";
  50.     }
  51.     return 0;
  52. }
  53.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement