結果
問題 | No.985 Hadamard |
ユーザー |
![]() |
提出日時 | 2020-03-31 18:08:54 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 84 ms / 2,000 ms |
コード長 | 1,761 bytes |
コンパイル時間 | 2,057 ms |
コンパイル使用メモリ | 171,392 KB |
実行使用メモリ | 7,424 KB |
最終ジャッジ日時 | 2024-06-24 22:08:12 |
合計ジャッジ時間 | 5,239 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 23 |
ソースコード
#include <bits/stdc++.h>using namespace std;template <class T, class F = multiplies<T>>T power(T a, long long n, F op = multiplies<T>(), T e = {1}) {assert(n >= 0);while (n) {if (n & 1) e = op(e, a);if (n >>= 1) a = op(a, a);}return e;}template <unsigned M> struct modular {using m = modular;unsigned v;modular(long long a = 0) : v((a %= M) < 0 ? a + M : a) {}m operator-() const { return m() -= *this; }m& operator+=(m r) { if ((v += r.v) >= M) v -= M; return *this; }m& operator-=(m r) { if (v < r.v) v += M; v -= r.v; return *this; }m& operator*=(m r) { v = (uint64_t)v * r.v % M; return *this; }m& operator/=(m r) { return *this *= power(r, M - 2); }friend m operator+(m l, m r) { return l += r; }friend m operator-(m l, m r) { return l -= r; }friend m operator*(m l, m r) { return l *= r; }friend m operator/(m l, m r) { return l /= r; }friend bool operator==(m l, m r) { return l.v == r.v; }};constexpr long long mod = 998244353;using mint = modular<mod>;int main() {cin.tie(nullptr);ios::sync_with_stdio(false);int n;cin >> n;vector<long long> c(1 << n);for (auto&& e : c) {cin >> e;}vector<mint> l(1 << n), h(1 << n);for (int i = 0; i < 1 << n; ++i) {int li, hi;cin >> li >> hi;l[i] = li, h[i] = hi;}for (int i = 0; i < n; ++i) {for (int bt = 0; bt < 1 << n; ++bt) {if (bt >> i & 1) {auto x = c[bt ^ 1 << i], y = c[bt];c[bt ^ 1 << i] = x + y;c[bt] = x - y;}}}mint res;for (int i = 0; i < 1 << n; ++i) {if (c[i] > 0) {res += c[i] * h[i];}if (c[i] < 0) {res += c[i] * l[i];}}res /= power(mint(2), n);cout << res.v << '\n';}