?
№ | Отправитель | Задача | Язык | Вердикт | Время | Память | Отослано | Протест. | |
---|---|---|---|---|---|---|---|---|---|
101940509 |
Дорешивание: luogu_bot4 |
1034E - 18 | GNU C++11 | Полное решение | 733 мс | 51304 КБ | 2020-12-21 10:55:34 | 2020-12-21 10:55:34 |
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int MAX = (1 << 21) + 5; int n; char s[MAX]; ll a[MAX], b[MAX], Pow[23], Count[MAX]; void FMT_or(ll *f, ll op) { for (int i = 1; i < (1 << n); i <<= 1) { for (int j = 0; j < (1 << n); j++) { if (!(j & i)) { f[j | i] = f[j | i] + f[j] * op; } } } } int main() { scanf("%d", &n); Pow[0] = 1; for (int i = 1; i <= n + 1; i++) Pow[i] = Pow[i - 1] * 4; for (int i = 1; i < (1 << n); i++) Count[i] = Count[i >> 1] + (i & 1); scanf("%s", s); for (int i = 0; i < (1 << n); i++) a[i] = 1ll * (s[i] - '0') * Pow[Count[i]]; scanf("%s", s); for (int i = 0; i < (1 << n); i++) b[i] = 1ll * (s[i] - '0') * Pow[Count[i]]; FMT_or(a, 1); FMT_or(b, 1); for (int i = 0; i < (1 << n); i++) a[i] = a[i] * b[i]; FMT_or(a, -1); for (int i = 0; i < (1 << n); i++) printf("%lld", (a[i] / Pow[Count[i]]) & 3); return 0; }
?
?
?
?