https://chat01.ai/ru/chat/01KPRC8S9FMT382A8R3600AH...
Creato il: 21 aprile 2026
Creato il: 21 aprile 2026
https://chat01.ai/ru/chat/01KPRC8S9FMT382A8R3600AHQ5
#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 x1 = 1 + x / 4;
int x2 = (x + 2) / 4;
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;
cout << (x1 * x + x2 * (xx1 - xx2)) % N << "\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 уже не то число, которое ввели, а какая-то промежуточная величина. Но ниже ты делаешь:
cppif (x - 1 >= 1) xx2 = (x - 1 - 1) / 4 + 1; else xx2 = 0;
То есть здесь должен использоваться исходный x, а не новый.
У тебя переменная x играет сразу две роли:
Это почти наверняка ошибка.
Сохрани исходный x отдельно, например:
cppvoid solve() { int n, x; cin >> n >> x; int orig_x = x; int x1 = 1 + orig_x / 4; int x2 = (orig_x + 2) / 4; int xx1, xx2; if (n >= 3) xx1 = (n - 3) / 4 + 1; else xx1 = 0; if (orig_x - 1 >= 3) xx2 = (orig_x - 1 - 3) / 4 + 1; else xx2 = 0; int cnt = (xx1 - xx2) % N; if (n >= 1) xx1 = (n - 1) / 4 + 1; else xx1 = 0; if (orig_x - 1 >= 1) xx2 = (orig_x - 1 - 1) / 4 + 1; else xx2 = 0; cout << (x1 * cnt + x2 * (xx1 - xx2)) % N << "\n"; }
В C++ % с отрицательными числами может дать отрицательный остаток.
То есть:
cppint cnt = (xx1 - xx2) % N;
может быть отрицательным. И итог тоже может стать отрицательным.
Лучше так:
cppint cnt = (xx1 - xx2) % N; if (cnt < 0) cnt += N;
И финальный вывод тоже:
cppint ans = (x1 * cnt + x2 * ((xx1 - xx2) % N)) % N; if (ans < 0) ans += N; cout << ans << "\n";
У тебя два основных косяка:
x и потом используешь его как исходный;% N.Если хочешь, я могу сразу переписать solve() аккуратно и привести полностью рабочую версию.
#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 x1 = 1 + x / 4;
int x2 = (x + 2) / 4;
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;
int xx = (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;
cout << (x1 * xx + x2 * (xx1 - xx2)) % N << "\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
*/
неправельный ответ тест 6
Сейчас в коде уже нет старой ошибки с перезаписью x, но для WA на скрытом тесте тут очень вероятны две другие проблемы.
% NВ C++ остаток может быть отрицательным:
cppint xx = (xx1 - xx2) % N;
Если xx1 < xx2, то xx станет отрицательным.
То же самое тут:
cpp(x1 * xx + x2 * (xx1 - xx2)) % N
(xx1 - xx2) тоже может быть отрицательным.
Надо нормализовать:
cppauto norm = [&](int v) { v %= N; if (v < 0) v += N; return v; };
long longВот это опасно:
cppx1 * xx x2 * (xx1 - xx2)
Даже если потом берёшь % N, переполнение происходит раньше.
Если n и x большие, x1, x2, xx1, xx2 могут быть порядка 1e18, и произведение уже не влезает в long long.
Нужно или:
__int128.cpp#include <bits/stdc++.h> #define int long long using namespace std; const int N = 998244353; int norm(int x) { x %= N; if (x < 0) x += N; return x; } void solve() { int n, x; cin >> n >> x; int x1 = 1 + x / 4; int x2 = (x + 2) / 4; 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; int xx = norm(xx1 - xx2); if (n >= 1) xx1 = (n - 1) / 4 + 1; else xx1 = 0; if (x - 1 >= 1) xx2 = (x - 1 - 1) / 4 + 1; else xx2 = 0; int part2 = norm(xx1 - xx2); int ans = ( (__int128)norm(x1) * xx + (__int128)norm(x2) * part2 ) % N; cout << ans << "\n"; } int32_t main() { ios_base::sync_with_stdio(0); cin.tie(0); int tests; cin >> tests; while (tests--) solve(); return 0; }
Если у тебя WA test 6, то почти наверняка одно из этого:
n, x произошло переполнение.Вот это:
cppint x1 = 1 + x / 4; int x2 = (x + 2) / 4;
Может быть off-by-one, если ты считаешь количество чисел в диапазоне 1..x по остаткам modulo 4.
Например, для таких задач обычно безопаснее писать через явную функцию подсчёта:
cppcnt(r, lim) = количество чисел <= lim, сравнимых с r по mod 4
Потому что формулы вида 1 + x / 4 легко ошибаются на малых x.
Если хочешь, пришли условие задачи, и я скажу уже точно: это ошибка в арифметике/модуле или у тебя сама формула подсчёта неверная.