ограничение по времени на тест2 секунды ограничени...
Создано: 27 июня 2026 г.
Отвечено с использованием GPT-5.5 Thinking от Chat01
Создано: 27 июня 2026 г.
Отвечено с использованием GPT-5.5 Thinking от Chat01
ограничение по времени на тест2 секунды
ограничение по памяти на тест256 мегабайт
В этой задаче отключены взломы.
Алиса и Боб играют в игру с массивом a
, состоящим из n
целых неотрицательных чисел. Алиса ходит первой.
В каждый ход текущий игрок должен выбрать массив из n
неотрицательных целых чисел b=[b1,b2,…,bn]
, удовлетворяющий следующим условиям:
0≤bi≤ai
для всех 1≤i≤n
;
∑ni=1bi>0
(то есть массив b
не состоит целиком из нулей);
b1⊕b2⊕…⊕bn=0
, где ⊕
обозначает операцию побитового XOR.
После выбора массива b
игрок обновляет массив a
, выполняя ai←ai−bi
для всех 1≤i≤n
.
Игрок, который не может выполнить такую операцию, проигрывает.
Определите количество допустимых выборов массива b
, которые Алиса может сделать в первый ход, гарантируя победу при условии, что оба игрока играют оптимально. Так как это число может быть большим, выведите ответ по модулю 998244353
.
Входные данные
Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число t
(1≤t≤104
) — количество наборов входных данных. Далее следует описание наборов входных данных.
Первая строка каждого набора входных данных содержит целое число n
(1≤n≤106
) — длину массива a
.
Вторая строка каждого набора входных данных содержит n
целых чисел a1,a2,…,an
(1≤ai<230
) — элементы массива a
.
Гарантируется, что сумма n
по всем наборам входных данных не превосходит 106
.
Выходные данные
Для каждого набора входных данных выведите количество допустимых выборов массива b
, которые Алиса может сделать в первый ход, гарантируя победу, по модулю 998244353
.
Пример
Входные данныеСкопировать
5
1
1
2
1 2
5
1 4 5 2 6
1
1073741823
3
1 2 3
Выходные данныеСкопировать
0
1
3
0
1
Примечание
В первом наборе входных данных Алиса должна выбрать массив b
длины 1
. Условия требуют b1≤a1
, b1>0
и b1=0
. Невозможно одновременно выполнить b1>0
и b1=0
. Таким образом, у Алисы нет допустимых ходов, и она сразу проигрывает. Ответ равен 0
.
Во втором наборе входных данных a=[1,2]
. Алиса должна выбрать b=[b1,b2]
. Условие b1⊕b2=0
означает, что b1=b2
. Поскольку 0≤b1≤1
и 0≤b2≤2
, а массив b
не может состоять целиком из нулей, единственный допустимый выбор — b=[1,1]
. Если Алиса выбирает b=[1,1]
, массив обновляется до a=[1−1,2−1]=[0,1]
. Теперь ход Боба. Аналогично ситуации Алисы, Боб должен выбрать b′
такой, что b′1=b′2
. Так как a1=0
, он вынужден выбрать b′1=0
, что означает b′2=0
. Поскольку допустимый ход требует ∑b′i>0
, у Боба нет допустимых ходов, и он проигрывает. Следовательно, b=[1,1]
— выигрышный ход для Алисы, и ответ равен 1
.
#include <bits/stdc++.h>
#define int long long
using namespace std;
using ll = long long;
using i128 = __int128_t;
const int N = 998244353;
const int L = 20;
const int C = 320;
const int B = 128;
int bpow(i128 x, i128 y) {
int cnt = 1;
x %= N;
textwhile (y > 0) { if (y % 2 == 1) cnt = ((i128)cnt * x) % N; x = ((i128)x * x) % N; y /= 2; } return cnt;
}
void solve() {
int n;
cin >> n;
vector< int > a(n);
for (int i = 0; i < n; i++) {
cin >> a[i];
}
int ans = 1;
for (int mask = 1; mask < n; mask = (mask << 1)) {
int cnt = 0;
textfor (int i = 0; i < n; i++) { if ((a[i] & mask) == 1) cnt++; } ans *= bpow(2, cnt - 1); ans %= N;
}
cout << ans << "\n";
}
int32_t main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
srand(time(0));
int tests = 1;
cin >> tests;
while (tests--) {
solve();
}
return 0;
}
в коде не учитывается что можно брать все от 0 до a[i] и берёт только а[i] надо исправить логику подсчёта минимально измени код сдлай решение прапвельное и пиши в моём счтиле переменные ток маленькиие tab = 2 шаблон не убьирать ток в solve писать код и без пояснений
pythonfrom functools import lru_cache def moves(a): n=len(a) res=[] def rec(i, cur, x): if i==n: if any(cur) and x==0: res.append(tuple(ai-bi for ai,bi in zip(a,cur))) return for b in range(a[i]+1): cur.append(b) rec(i+1, cur, x^b) cur.pop() rec(0, [], 0) return res def P_table(n,maxv): @lru_cache(None) def win(a): ms=moves(a) return any(not win(m) for m in ms) Ps=[] for vals in __import__('itertools').product(range(maxv+1), repeat=n): if not win(vals): Ps.append(vals) return Ps, win for n in range(1,5
cppvoid solve() { int n; cin >> n; vector< int > a(n); int x = 0; for (int i = 0; i < n; i++) { cin >> a[i]; x ^= a[i]; } if (n == 1) { cout << 0 << "\n"; return; } int ans = (x == 0); for (int i = 0; i < n; i++) { int y = (x ^ a[i]); if (y < a[i]) ans++; } cout << ans % N << "\n"; }