[BZOJ3529][SDOI2014]数表(莫比乌斯反演+树状数组)
来源:互联网 发布:gtx1050ti 知乎 编辑:程序博客网 时间:2024/06/08 12:56
1、概述
莫比乌斯反演。首先,预处理出
2、先不考虑a的限制
可以推出,
设
3、再考虑a的限制
可以想到,对于任何
考虑到
4、代码
#include <cmath>#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;inline int read() { int res = 0; bool bo = 0; char c; while (((c = getchar()) < '0' || c > '9') && c != '-'); if (c == '-') bo = 1; else res = c - 48; while ((c = getchar()) >= '0' && c <= '9') res = (res << 3) + (res << 1) + (c - 48); return bo ? ~res + 1 : res;}const int MaxN = 1e5, N = MaxN + 5, M = 403205;bool mark[N]; int Q, miu[N], T[M], pri[N], tot, L[M], R[M], ans[N];void change(int x, int v) { for (; x <= MaxN; x += x & -x) T[x] += v;}int ask(int x) { int res = 0; for (; x; x -= x & -x) res += T[x]; return res;}struct cyx {int id, val;} f[MaxN];struct pyz {int id, n, m, a;} q[MaxN];inline bool ccyx(const cyx &a, const cyx &b) { return a.val < b.val;}inline bool cpyz(const pyz &a, const pyz &b) { return a.a < b.a;}void sieve() { int i, j; mark[0] = mark[1] = 1; miu[1] = 1; for (i = 2; i <= MaxN; i++) { if (!mark[i]) pri[++tot] = i, miu[i] = -1; for (j = 1; j <= tot; j++) { if (1ll * i * pri[j] > MaxN) break; mark[i * pri[j]] = 1; if (i % pri[j] == 0) break; else miu[i * pri[j]] = -miu[i]; } } for (i = 1; i <= MaxN; i++) { f[i].id = i; for (j = i; j <= MaxN; j += i) f[j].val += i; } sort(f + 1, f + MaxN + 1, ccyx); for (i = 1; i <= MaxN;) { L[f[i].val] = j = i; for (; f[i].val == f[j].val; j++); R[f[i].val] = j - 1; i = j; }}void addD(int x) { if (!L[x]) return; int i, j, k; for (i = L[x]; i <= R[x]; i++) { k = 0; int u = f[i].id; for (j = u; j <= MaxN; j += u) change(j, x * miu[++k]); }}int queryD(int l, int r) { return ask(r) - ask(l - 1);}void Next(int x) { int i; for (i = q[x - 1].a + 1; i <= q[x].a; i++) addD(i);}void ins(int id) { q[id].n = read(); q[id].m = read(); q[id].a = read(); q[id].id = min(id, 403200);}int solve(int x) { Next(x); int i, r = min(q[x].n, q[x].m), ans = 0; for (i = 1; i <= r;) { int nxt = min(q[x].n / (q[x].n / i), q[x].m / (q[x].m / i)); ans += (q[x].n / i) * (q[x].m / i) * queryD(i, nxt); i = nxt + 1; } return ans < 0 ? ans += 2147483648ll : ans;}int main() { sieve(); int i; Q = read(); for (i = 1; i <= Q; i++) ins(i); sort(q + 1, q + Q + 1, cpyz); for (i = 1; i <= Q; i++) ans[q[i].id] = solve(i); for (i = 1; i <= Q; i++) printf("%d\n", ans[i]); return 0;}
阅读全文
0 0
- [BZOJ3529][Sdoi2014]数表 && 莫比乌斯反演+树状数组
- [BZOJ3529]SDOI2014数表|莫比乌斯反演|树状数组
- 【bzoj3529】【SDOI2014】【数表】【莫比乌斯反演+树状数组】
- [BZOJ3529] [SDOI2014] 数表 - 莫比乌斯反演 - 树状数组
- bzoj3529 [Sdoi2014]数表(莫比乌斯反演+树状数组)
- [BZOJ3529][Sdoi2014]数表(莫比乌斯反演+树状数组)
- [BZOJ3529][SDOI2014]数表(莫比乌斯反演+树状数组)
- 【bzoj3529】[Sdoi2014]数表 线性筛法+树状数组+莫比乌斯反演+数论分块
- BZOJ3529 [Sdoi2014]数表 【莫比乌斯反演】
- 3529: [Sdoi2014]数表 莫比乌斯反演+树状数组
- 3529: [Sdoi2014]数表|莫比乌斯反演|树状数组
- [莫比乌斯反演+数状数组] BZOJ3529: [Sdoi2014]数表
- 【BZOJ3529】数表(莫比乌斯反演)(树状数组)(数学)
- 【莫比乌斯反演】[BZOJ3529]数表
- 【BZOJ】】【P3529】【Sdoi2014】【数表】【题解】【莫比乌斯反演+离线+树状数组】
- BZOJ 3529 SDOI2014 数表 莫比乌斯反演+树状数组
- bzoj 3529: [Sdoi2014]数表 莫比乌斯反演&树状数组
- [莫比乌斯反演 树状数组] BZOJ 3529 [Sdoi2014]数表
- java.awt.headless 模式
- Linux负载均衡软件LVS
- 利用三目运算跟if,输出最小值
- websocket
- 对称的二叉树 java实现
- [BZOJ3529][SDOI2014]数表(莫比乌斯反演+树状数组)
- 2017.11.10作业
- 转载-机器学习-逻辑回归-参数迭代公式推导
- Structure SOMLRECI1(SAPoffice: Structure of the API Recipient List)
- 第二个春天
- RabbitMQ教程总结
- libopencm3库的使用
- windows下编译Sqlcipher
- 分享一个重温The C Programming Language时觉得需要注意的地方