Advertisement
999ms

Untitled

Nov 10th, 2019
225
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.46 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define all(x) (x).begin(),(x).end()
  3.  
  4. using namespace std;
  5. using ll = long long;
  6.  
  7. const int N = 25000;
  8.  
  9. void Solve() {
  10.     int n, k;
  11.     cin >> n >> k;
  12.     vector<int> a(n - k + 1);
  13.     for (int i = 0; i < a.size(); i++) {
  14.         cin >> a[i];
  15.     }
  16.     bitset<2 * N> tot;
  17.     for (int i = 0; i < n; i++) tot[i] = 1;
  18.     bitset<2 * N> cur;
  19.     vector<vector<ll>> dlts;
  20.     for (int i = 0; i < k; i++) {
  21.         dlts.push_back({0});
  22.     }
  23.     for (int i = 1; i < n - k + 1; i++) {
  24.         dlts[(i - 1) % k].push_back(dlts[(i - 1) % k].back() + a[i] - a[i - 1]);
  25.     }
  26.     for (int i = 0; i < k; i++) {
  27.         ll dlt = *min_element(all(dlts[i]));
  28.         for (ll& val : dlts[i]) val -= dlt;
  29.         if (*max_element(all(dlts[i])) >= n || *min_element(all(dlts[i])) < 0) {
  30.             cout << "0\n";
  31.             return;
  32.         }
  33.     }
  34.     vector<int> per;
  35.     vector<bitset<2 * N>> arr(k);
  36.     for (int i = 0; i < k; i++) {
  37.         for (int val : dlts[i]) {
  38.             arr[i][val] = 1;
  39.         }
  40.     }
  41.     for (int i = 0; i < k; i++) per.push_back(i);
  42.     vector<vector<int>> ans;
  43.     do {
  44.         cur.reset();
  45.         vector<int> dlt2;
  46.         for (int i = 0; i < k; i++) {
  47.             for (int j = 0; j < n; j++) {
  48.                 if (cur[j] == 0) {
  49.                     cur |= arr[per[i]] << j;
  50.                     dlt2.push_back(j);
  51.                     break;
  52.                 }
  53.             }
  54.         }
  55.         if ((cur & tot).count() == n) {
  56.             vector<int> curans(n);
  57.             for (int i = 0; i < k; i++) {
  58.                 int curind = per[i];
  59.                 for (int j = 0; j < dlts[curind].size(); j++) {
  60.                     curans[j * k + curind] = dlts[curind][j] + dlt2[i];
  61.                 }
  62.             }
  63.             for (int j = 0; j < n; j++) {
  64.                 cur[curans[j]] = 0;
  65.             }
  66.             if (cur.count() == 0 && *max_element(all(curans)) < n && accumulate(curans.begin(), curans.begin() + k, 0LL) + k == a[0]) {
  67.                 ans.push_back(curans);
  68.             }
  69.         }
  70.     } while(next_permutation(all(per)));
  71.     cout << ans.size() << "\n";
  72.     sort(all(ans));
  73.     for (auto& v : ans) {
  74.         for (int val : v) {
  75.             cout << val + 1 << " ";
  76.         }
  77.         cout << '\n';
  78.     }
  79. }
  80.  
  81.  
  82. int main() {
  83.     ios_base::sync_with_stdio(false);
  84.     cin.tie(nullptr);
  85.     cout.tie(nullptr);
  86.     int q;
  87.     cin >> q;
  88.     while (q--) {
  89.         Solve();
  90.     }
  91. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement