acgo题库
  • 首页
  • 题库
  • 学习
  • 竞赛
  • 讨论
  • 排行
  • 团队
  • 备赛专区

    竞赛

    • CSP-J/S
    • 蓝桥杯

    考级

    • GESP
    • CPA
    • 电子学会考级
登录
注册
题目详情提交记录(0)
  • 题解

    说*****简单*****那是假的 题解如下

    userId_undefined

    elegant Demon

    时间刺客时空双修者空间掌握者秩序白银
    134阅读
    4回复
    2点赞
  • e......

    #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; }

    userId_undefined

    我的世界老玩家(专攻难题,互关)

    倔强青铜空间掌握者时间刺客模拟·模拟练习生分支·分支解题者数组·数组操作员
    2阅读
    0回复
    1点赞
暂无数据

提交答案之后,这里将显示提交结果~

首页