题解
2025-06-14 23:28:50
发布于:新疆
5阅读
0回复
0点赞
说*****简单*****那是假的
题解如下
#include <algorithm>
#include <cstdio>
using namespace std;
const long long mod = 998244353;
const int maxn = 300010;
int n, m, a;
long long A[maxn];
int gcd(int x, int y) {
while (y) {
x %= y;
swap(x, y);
}
return x;
}
long long SG(long long x) {
if (a == 0) return x;
if (x < m + a) return (x / a) & 1;
x -= 2 * a;
long long q = x / m, r = x % m;
if (2 * a <= m) {
return (r % (2 * a) >= a) ? 1 : ((r >= m - a) << 1);
}
return r < m - a ? 0 : min(q + 1, (m - r - 1) / (m - a)) + 1;
}
int main() {
scanf("%d %d %d", &n, &m, &a);
int g = gcd(a, m);
m /= g, a /= g;
long long nim = 0;
for (int i = 1; i <= n; i++) {
scanf("%lld", &A[i]);
A[i] /= g;
nim ^= SG(A[i]);
}
if (nim == 0) {
printf("0\n");
return 0;
}
if (a == 0) {
int ans = 0;
for (int i = 1; i <= n; i++) ans += (nim ^ A[i]) < A[i];
printf("%d\n", ans);
return 0;
}
long long ans = 0;
for (int i = 1; i <= n; i++) {
auto get = [m, a](long long x, long long v) {
long long l = 0, r = (x - a) / m;
while (l <= r) {
long long mid = (l + r) >> 1;
if (SG((x - a) % m + mid * m) <= v) l = mid + 1;
else r = mid - 1;
}
return l;
};
long long v = nim ^ SG(A[i]);
ans = (ans + get(A[i], v) - get(A[i], v - 1)) % mod;
}
printf("%lld\n", ans);
return 0;
}
这里空空如也
有帮助,赞一个