https://chat01.ai/ru/chat/01KPR9JKX5M8CJJ0M424P2V5...
Criado em: 21 de abril de 2026
Criado em: 21 de abril de 2026
https://chat01.ai/ru/chat/01KPR9JKX5M8CJJ0M424P2V56A
смотри у тебя тут код
но
напиши решение по моей идее типо
ищешь cnt_r это количество различных l которое будет
а потом чекаешшь есле n % 3 == 0 то сумма количество y = (подотрезок 1 n) + (y - 1) * 2
но вместо этогоо замени это на формулу
решение без функций
Да, тут идея почти правильная, но ключ не в n % 3, а в остатках по модулю 4.
Потому что для префиксного XOR:
имеем цикл:
k % 4 == 0 -> pref(k) = kk % 4 == 1 -> pref(k) = 1k % 4 == 2 -> pref(k) = k + 1k % 4 == 3 -> pref(k) = 0Значит одинаковые значения массово встречаются только у:
pref(k) = 0, когда k = 0 или k % 4 == 3pref(k) = 1, когда k % 4 == 1Поэтому надо считать не через n % 3, а через количество чисел нужных остатков на отрезках.
Если хочешь решение без функций, вот готовый код:
cpp#include <bits/stdc++.h> using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); const long long MOD = 998244353; int t; cin >> t; while (t--) { long long n, x; cin >> n >> x; long long a0 = 1 + x / 4; long long a1 = (x + 2) / 4; long long b0 = 0; long long b1 = 0; if (x <= n) { long long c3n = (n >= 3 ? (n - 3) / 4 + 1 : 0); long long c3x = (x - 1 >= 3 ? (x - 1 - 3) / 4 + 1 : 0); b0 = c3n - c3x; long long c1n = (n >= 1 ? (n - 1) / 4 + 1 : 0); long long c1x = (x - 1 >= 1 ? (x - 1 - 1) / 4 + 1 : 0); b1 = c1n - c1x; } long long ans = ((a0 % MOD) * (b0 % MOD) + (a1 % MOD) * (b1 % MOD)) % MOD; cout << ans << '\n'; } return 0; }
Коротко по смыслу:
a = l - 1b = rТак как уникальные значения совпасть не могут на двух непересекающихся диапазонах, остаются только 0 и 1.
Поэтому:
где:
cntA0 = 1 + x / 4cntA1 = (x + 2) / 4cntB0 — сколько чисел b на [x, n] таких, что b % 4 == 3cntB1 — сколько чисел b на [x, n] таких, что b % 4 == 1Если хочешь, я могу ещё переписать это совсем в твоём стиле, с переменными типа cnt_l, cnt_r, без формального объяснения.
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 998244353;
const int C = 380;
const int B = 64;
void solve() {
int n, x;
cin >> n >> x;
int ans = (((1 + x / 4) % N) * (((x + 2) / 4) % N)) % N;
int xx1, xx2;
if (n >= 3) xx1 = (n - 3) / 4 + 1;
else xx1 = 0;
if (x - 1 >= 3) xx2 = (x - 1 - 3) / 4 + 1;
else xx2 = 0;
x = (xx1 - xx2) % N;
if (n >= 1) xx1 = (n - 1) / 4 + 1;
else xx1 = 0;
if (x - 1 >= 1) xx2 = (x - 1 - 1) / 4 + 1;
else xx2 = 0;
ans += (x * (xx1 - xx2)) % 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;
}
/*
i + 2
j старт + 2
j + 4
0
x = 7
n = 12
3 12 - 2
5 12 - 1
7 12 - 1
9 12 - 0
1
3 13 - 2
5 13 - 2
7 13 - 1
9 13 - 1
2
3 14 - 2
5 14 - 2
7 14 - 1
9 14 - 1
0
3 15 - 3
5 15 - 2
7 15 - 2
9 15 - 1
*/
что не так минимально исправь код
Минимально у тебя не так вот что:
Ты затираешь x
cppx = (xx1 - xx2) % N;
после этого x уже не исходный x, и ниже выражение
cppif (x - 1 >= 1)
работает уже не с тем числом.
Первая строка с ans неверная
cppint ans = (((1 + x / 4) % N) * (((x + 2) / 4) % N)) % N;
тут ты перемножаешь количество для 0 и количество для 1 слева, а надо:
cntL0 * cntR0cntL1 * cntR1Вот минимально исправленный код, почти без изменений:
cpp#include <bits/stdc++.h> #define int long long using namespace std; const int N = 998244353; const int C = 380; const int B = 64; void solve() { int n, x; cin >> n >> x; int lx0 = (1 + x / 4) % N; // сколько 0 слева int lx1 = ((x + 2) / 4) % N; // сколько 1 слева int xx1, xx2; int r0, r1; if (n >= 3) xx1 = (n - 3) / 4 + 1; else xx1 = 0; if (x - 1 >= 3) xx2 = (x - 1 - 3) / 4 + 1; else xx2 = 0; r0 = (xx1 - xx2) % N; if (r0 < 0) r0 += N; if (n >= 1) xx1 = (n - 1) / 4 + 1; else xx1 = 0; if (x - 1 >= 1) xx2 = (x - 1 - 1) / 4 + 1; else xx2 = 0; r1 = (xx1 - xx2) % N; if (r1 < 0) r1 += N; int ans = (lx0 * r0) % N; ans = (ans + (lx1 * r1) % N) % 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; }
Было:
cppans = cntL0 * cntL1 x = cntR0 ans += x * cntR1
Надо:
cppans = cntL0 * cntR0 + cntL1 * cntR1
То есть основная проблема — перепутаны множители и затёрт x.
Могу ещё сделать версию вообще без новых переменных, прям с максимально маленьким diff.