結果
問題 | No.1741 Arrays and XOR Procedure |
ユーザー |
![]() |
提出日時 | 2021-11-15 18:39:32 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 58 ms / 2,000 ms |
コード長 | 2,204 bytes |
コンパイル時間 | 656 ms |
コンパイル使用メモリ | 44,236 KB |
実行使用メモリ | 6,272 KB |
最終ジャッジ日時 | 2024-12-15 00:49:15 |
合計ジャッジ時間 | 4,347 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 41 |
ソースコード
/* -*- coding: utf-8 -*-** 1741.cc: No.1741 Arrays and XOR Procedure - yukicoder*/#include<cstdio>#include<algorithm>using namespace std;/* constant */const int MAX_N = 200000;const int MOD = 998244353;/* typedef */template<const int MOD>struct MI {int v;MI(): v() {}MI(int _v): v(_v % MOD) {}MI(long long _v): v(_v % MOD) {}MI operator+(const MI m) const { return MI(v + m.v); }MI operator-(const MI m) const { return MI(v + MOD - m.v); }MI operator*(const MI m) const { return MI((long long)v * m.v); }MI &operator+=(const MI m) { return (*this = *this + m); }MI &operator-=(const MI m) { return (*this = *this - m); }MI &operator*=(const MI m) { return (*this = *this * m); }MI pow(int n) const { // a^n % MODMI pm = 1, a = *this;while (n > 0) {if (n & 1) pm *= a;a *= a;n >>= 1;}return pm;}MI inv() const { return pow(MOD - 2); }MI operator/(const MI m) const { return *this * m.inv(); }MI &operator/=(const MI m) { return (*this = *this / m); }};typedef MI<MOD> mi;/* global variables */int bs[MAX_N], pcs[MAX_N];mi fs[MAX_N + 1], invfs[MAX_N + 1];/* subroutines */inline mi nck(int n, int k) { // nCk % MODreturn fs[n] * invfs[n - k] * invfs[k];}void prepare_fracs(int n) {fs[0] = invfs[0] = 1;for (int i = 1; i <= n; i++) {fs[i] = fs[i - 1] * i;invfs[i] = fs[i].inv();}}inline int de2(int a) {if (a <= 0) return 0;int c = 0;while (! (a & 1)) c++, a >>= 1;return c;}/* main */int main() {int n;scanf("%d", &n);for (int i = 0; i < n; i++) scanf("%d", bs + i);pcs[0] = 0;for (int i = 1; i < n; i++)pcs[i] = pcs[i - 1] + de2(n - i) - de2(i);//for (int i = 0; i < n; i++) printf("%d ", pcs[i]); putchar('\n');int on = 0, en = 0, x = 0;for (int i = 0; i < n; i++) {if (bs[i] < 0) {if (pcs[i] == 0) on++;else en++;}elsex ^= (pcs[i] == 0 ? 1 : 0) * bs[i];}//printf("on=%d, en=%d, x=%d\n", on, en, x);prepare_fracs(n);mi sum = 0;for (int i = x ^ 1; i <= on; i += 2) sum += nck(on, i);sum *= mi(2).pow(en);printf("%d\n", sum.v);return 0;}