JZOJ 2022.02.11【提高A组】模拟
首先把 给切了, 找半天规律找不到
然后打了个表算是暴力了
也暴。。。
太暴了。。。
直接啥也不会
考虑一个 的答案
或 的 组数
就是一般的分类讨论了,记一个数 的答案为 , 为 的约数个数
那么
其余则为
具体考虑 和 的 值即可
#include <cstdio> #define RE register using namespace std; typedef long long LL; const int N = 1e7 + 5; int x, y, d[N], _d[N], num[N], tot, pr[N / 10], vis[N], ans; void Sieve() { d[1] = _d[1] = num[1] = 1; for(RE int i = 2; i <= 1e7 + 3; i++) { if (!vis[i]) pr[++tot] = i, d[i] = 2, num[i] = 1, _d[i] = 3; for(RE int j = 1, z; j <= tot && pr[j] * i <= 1e7 + 3; j++) { vis[z = i * pr[j]] = 1; if (i % pr[j] == 0) { num[z] = num[i] + 1, d[z] = d[i] / num[z] * (num[z] + 1); _d[z] = _d[i] / (num[i] * 2 + 1) * (num[z] * 2 + 1); break; } else d[z] = d[i] * 2, num[z] = 1, _d[z] = _d[i] * 3; } } } int main() { Sieve(), scanf("%d%d", &x, &y); for(RE int a = x; a <= y; a++) if (a & 1) ans += (LL)_d[a] / 2 + (LL)d[(a + 1) / 2] * d[(a - 1) / 2] / 2; else ans += (LL)d[a + 1] * d[a - 1] / 2 + _d[a / 2] / 2; printf("%d\n", ans); }
一眼分位变成线段树赋值和异或操作
#include <cstdio> #define RE register #define IN inline using namespace std; const int N = 5e4 + 5, LG = 9, SZ = N * 4, M = LG + 2; int n, m, a[N]; struct SegmenTree{ #define ls (p << 1) #define rs (ls | 1) int sum[SZ][M], tg1[SZ][M], tg2[SZ][M]; IN void pushup(int p, int k){sum[p][k] = sum[ls][k] + sum[rs][k];} void build(int p, int l, int r) { for(RE int j = 0; j <= LG; j++) tg1[p][j] = -1; if (l == r) { for(RE int j = 0; j <= LG; j++) sum[p][j] = ((a[l] >> j) & 1); return; } int mid = l + r >> 1; build(ls, l, mid), build(rs, mid + 1, r); for(RE int j = 0; j <= LG; j++) pushup(p, j); } IN void push(int p, int k, int z, int l, int r) { if (z == 0 || z == 1) sum[p][k] = z * (r - l + 1), tg1[p][k] = z; else{ sum[p][k] = r - l + 1 - sum[p][k], tg2[p][k] ^= 1; if (tg1[p][k] != -1) tg1[p][k] ^= 1; } } IN void pushdown(int p, int k, int l, int r) { int mid = l + r >> 1; if (tg2[p][k]) push(ls, k, 2, l, mid), push(rs, k, 2, mid + 1, r), tg2[p][k] = 0; if (tg1[p][k] != -1) push(ls, k, tg1[p][k], l, mid), push(rs, k, tg1[p][k], mid + 1, r), tg1[p][k] = -1; } void assign(int p, int l, int r, int k, int x, int y, int z) { if (x > r || y < l) return; if (x <= l && r <= y) return push(p, k, z, l, r), void(); pushdown(p, k, l, r); int mid = l + r >> 1; if (x <= mid) assign(ls, l, mid, k, x, y, z); if (y > mid) assign(rs, mid + 1, r, k, x, y, z); pushup(p, k); } void reverse(int p, int l, int r, int k, int x, int y) { if (x > r || y < l) return; if (x <= l && r <= y) return push(p, k, 2, l, r), void(); pushdown(p, k, l, r); int mid = l + r >> 1; if (x <= mid) reverse(ls, l, mid, k, x, y); if (y > mid) reverse(rs, mid + 1, r, k, x, y); pushup(p, k); } int Query(int p, int l, int r, int k, int x, int y) { if (x > r || y < l) return 0; if (x <= l && r <= y) return sum[p][k]; pushdown(p, k, l, r); int mid = l + r >> 1, res = 0; if (x <= mid) res = Query(ls, l, mid, k, x, y); if (y > mid) res += Query(rs, mid + 1, r, k, x, y); return res; } }T; int main() { scanf("%d%d", &n, &m); for(RE int i = 1; i <= n; i++) scanf("%d", &a[i]); T.build(1, 1, n); char op[10]; for(RE int l, r, x; m; --m) { scanf("%s%d%d", op, &l, &r); if (op[0] == 'a'){ scanf("%d", &x); for(RE int j = 0; j <= LG; j++) if (!((x >> j) & 1)) T.assign(1, 1, n, j, l, r, 0); } else if (op[0] == 'o'){ scanf("%d", &x); for(RE int j = 0; j <= LG; j++) if ((x >> j) & 1) T.assign(1, 1, n, j, l, r, 1); } else if (op[0] == 'x'){ scanf("%d", &x); for(RE int j = 0; j <= LG; j++) if ((x >> j) & 1) T.reverse(1, 1, n, j, l, r); } else if (op[1] == 'x'){ int res = 0, z; for(RE int j = 0; j <= LG; j++) z = T.Query(1, 1, n, j, l, r), res += ((z & 1) ? (1 << j) : 0); printf("%d\n", res); } else{ int res = 0, z; for(RE int j = 0; j <= LG; j++) z = T.Query(1, 1, n, j, l, r), res += z * (1 << j); printf("%d\n", res); } } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效