Quera problem

 avatar
unknown
plain_text
7 months ago
2.7 kB
48
Indexable
#include <bits/stdc++.h>
using namespace std;

#define FOR(x,n) for(int x=0;x<n;x++)
#define FORR(x,a,b) for(int x=a;x<=b;x++)
using ll = long long;
using ii = pair<int,int>;

void print_base3(int n, int len) {
  vector<int> res;
  FOR(_,len) {
    res.push_back(n % 3);
    n /= 3;
  }
  reverse(res.begin(), res.end());
  for(int v : res) cout << v << ' ';
}

int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  // mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
  
  int n, m;
  cin >> n >> m;
  vector<int> a(n);
  FOR(i,n) cin >> a[i];
  
  int k = min(n, 30);
  vector<int> first_group, second_group;
  FOR(i,k) {
    if(i < k/2) first_group.push_back(a[i]);
    else second_group.push_back(a[i]);
  }
  
  vector<ii> first_group_options, second_group_options;
  first_group_options.reserve(2e7);
  second_group_options.reserve(2e7);
  int first_group_mask_with_zero_difference = 0, second_group_mask_with_zero_difference = 0;
  
  auto finish = [&](int first_mask, int second_mask) {
    cout << "alhamdolellah\n";
    print_base3(first_mask, k/2);
    print_base3(second_mask, k - k/2);
    FOR(_,n-k) cout << "0 ";
    cout << '\n';
    exit(0);
  };
  
  auto dfs = [&](auto&& dfs, int i, int mask, int difference, bool is_first) -> void {
    if(is_first && i == k/2) {
      if(!difference) first_group_mask_with_zero_difference = mask;
      else first_group_options.push_back({difference, mask}); 
    }
    else if(!is_first && i == k - k/2) {
      if(!difference) second_group_mask_with_zero_difference = mask;
      else second_group_options.push_back({difference, mask});
    }
    else {
      int el = is_first ? first_group[i] : second_group[i];
      mask *= 3;
      dfs(dfs, i + 1, mask, difference, is_first);
      dfs(dfs, i + 1, mask + 1, (difference + el) % m, is_first);
      dfs(dfs, i + 1, mask + 2, (difference - el + m) % m, is_first);
    }
  };
  
  dfs(dfs, 0, 0, 0, true);
  dfs(dfs, 0, 0, 0, false);
  
  if(first_group_mask_with_zero_difference || second_group_mask_with_zero_difference)
    finish(first_group_mask_with_zero_difference, second_group_mask_with_zero_difference);
  
  sort(first_group_options.begin(), first_group_options.end());
  sort(second_group_options.begin(), second_group_options.end());
  
  int i = (int)first_group_options.size() - 1;
  for(auto [second_difference, second_mask] : second_group_options) {
    while(i >= 0 && first_group_options[i].first + second_difference > m) i--;
    if(i >= 0 && first_group_options[i].first + second_difference == m)
      finish(first_group_options[i].second, second_mask);
  }
  
  cout << "laelahaellallah\n";
}
Editor is loading...
Leave a Comment