Quera problem
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