BZOJ 3529: [Sdoi2014]数表
二次联通门 : BZOJ 3529: [Sdoi2014]数表
Latex的公式写起来略麻烦。。。
设$\LARGE F(x)=\sum_{d|x} \lfloor \dfrac xd \rfloor$
$\LARGE Answer = \sum_{i=1}^n\sum_{j=1}^{m}F(\gcd(i,j))*[F(\gcd(i,j)<=a]$
当没有$a$的限制时
$\LARGE Answer = \sum_{d=1}^{n}\sum_{i=1}^{n}\sum_{j=1}^{m}F(d)*[\gcd(i,j)=d]$
$\LARGE=\sum_{d=1}^{n}F(d)\sum_{i=1}^{n/d}\sum_{j=1}^{m/d}[\gcd(i,j)=1]$
由莫比乌斯反演得(见BZOJ 1101: [POI2007]Zap):
$\LARGE Answer = \sum_{d=1}^{n}F(d)\sum_{i=1}^n\mu(i)\lfloor \dfrac {n}{id} \rfloor \lfloor \dfrac {m}{id} \rfloor $
$\LARGE =\sum_{d=1}^{n}\lfloor \dfrac nd \rfloor \lfloor \dfrac md \rfloor\sum_{i|d}\mu(\dfrac ni)F(i)$
然后对于 $\LARGE \sum_{d=1}^{n}\lfloor \dfrac nd \rfloor \lfloor \dfrac md \rfloor$可以$O(n\sqrt n)$计算
后一部分也可以预先预处理出来
再把$a$的限制加上
离线处理这个问题
将$F$和$a$都排个序,那么要计算的就是$F(i)<=a$的$i$
那么就可以用树状数组维护$\LARGE \sum_{i|d}\mu(\dfrac ni)F(i)$的前缀和,每次插入小于当前$a$的$F[i]$,后每次询问前缀和即可
/*BZOJ 3529: [Sdoi2014]数表树状数组+莫比乌斯反演*/ #include <cstdio> #include <iostream> #include <algorithm>#define rg registerinline void read (int &n) {rg char c = getchar ();for (n = 0; !isdigit (c); c = getchar ());for (; isdigit (c); n = n * 10 + c - '0', c = getchar ()); } #define Max 100000int t[Max + 9], p[Max + 9], mu[Max + 9]; bool is[Max + 9]; inline int min (int a, int b) { return a < b ? a : b; }void Euler (int N) {rg int i, j, k; int C = 0; mu[1] = 1;for (i = 2; i <= N; ++ i){if (!is[i]) p[++ C] = i, mu[i] = -1;for (j = 1; j <= C; ++ j){if ((k = i * p[j]) > N) break;is[k] = true;if (i % p[j] == 0) { mu[k] = 0; break; }else mu[k] = -mu[i];}} }struct Q { int x, y; Q (int a = 0, int b = 0) : x (a), y (b) { } bool operator < (const Q &rhs) const{ return x == rhs.x ? y < rhs.y : x < rhs.x; } } f[Max + 9];void F () {rg int i, j;for (i = 1; i <= Max; ++ i)for (j = i; j <= Max; j += i) f[j].x += i;for (i = 1; i <= Max; ++ i) f[i].y = i;std :: sort (f + 1, f + 1 + Max); }struct D { int n, m, a, id; bool operator < (const D &rhs) const{ return a < rhs.a; } } q[Max + 9]; int Answer[Max + 9];inline int Query (int x) {int res = 0;for (rg int i = x; i; i -= i & (-i))res += t[i];return res; } void Change (int x, int k) { for (rg int i = x; i <= Max; i += i & (-i)) t[i] += k; }int Ask (int N, int M) {int res = 0, j; if (N > M) std :: swap (N, M);for (rg int i = 1; i <= N; i = j + 1){j = min (N / (N / i), M / (M / i));res += (N / i) * (M / i) * (Query (j) - Query (i - 1));}return res & 0x7fffffff; }int main (int argc, char *argv[]) {int N, M; rg int i, j, k;Euler (Max); F ();int T; read (T);for (i = 1; i <= T; ++ i)read (q[i].n), read (q[i].m), read (q[i].a), q[i].id = i;std :: sort (q + 1, q + 1 + T);for (i = 1, j = 1; i <= T; ++ i){for (; j <= Max && f[j].x <= q[i].a; ++ j)for (k = f[j].y; k <= Max; k += f[j].y)Change (k, f[j].x * mu[k / f[j].y]);Answer[q[i].id] = Ask (q[i].n, q[i].m); }for (i = 1; i <= T; ++ i)printf ("%d\n", Answer[i]);return 0; }
转载于:https://www.cnblogs.com/ZlycerQan/p/8067463.html
BZOJ 3529: [Sdoi2014]数表相关推荐
- BZOJ 3529: [Sdoi2014]数表 莫比乌斯
3529: [Sdoi2014]数表 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 1879 Solved: 949 [Submit][Statu ...
- 3529: [Sdoi2014]数表 - BZOJ
Description 有一张N×m的数表,其第i行第j列(1 < =i < =n,1 < =j < =m)的数值为 能同时整除i和j的所有自然数之和.给定a,计算数表中不大于 ...
- (每日一题)P3312 [SDOI2014]数表(经典莫比乌斯反演 + 树状数组维护离线询问)
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 每日一题(莫反 / 多项式 / 母函数 / 群论) 2021.4.11 莫反 P3312 [SDOI2 ...
- P3312 [SDOI2014]数表(离线 + 树状数组前缀和优化)
P3312 [SDOI2014]数表 推式子 ∑i=1n∑j=1mσ(gcd(i,j))∑d=1nσ(d)∑i=1nd∑j=1md[gcd(i,,j)==1]∑d=1nσ(d)∑d=1ndμ(k)nk ...
- [BZOJ3529][Sdoi2014]数表
[BZOJ3529][Sdoi2014]数表 试题描述 有一张N×m的数表,其第i行第j列(1 < =i < =n,1 < =j < =m)的数值为能同时整除i和j的所有自然数 ...
- BZOJ 3531[Sdoi2014]旅行
BZOJ 3531[Sdoi2014]旅行 题面描述 传送门 题目分析 可以考虑到,如果这个题所有城市都只信一种宗教的话,就是一个sb树剖,直接进行链的查询和修改就能搞定.多个宗教的话,可以有一种暴力 ...
- BZOJ 3529 数表(莫比乌斯+树状数组)
题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3529 题意:有一张n×m的数表,其第i行第j列的数值为能同时整除i和j的所有自然数 ...
- 「BZOJ 3529」「SDOI 2014」数表「莫比乌斯反演」
题意 有一张 \(n\times m\) 的数表,其第\(i\)行第\(j\)列的数值为能同时整除\(i\)和\(j\)的所有自然数之和. \(T\)组数据,询问对于给定的 \(n,m,a\) , 计 ...
- [BZOJ 3531] [Sdoi2014] 旅行 【离线+LCT】
题目链接:BZOJ - 3531 题目分析 题目询问一条路径上的信息时,每次询问有某种特定的文化的点. 每个点的文化就相当于一种颜色,每次询问一条路径上某种颜色的点的信息. 可以使用离线算法, 类似于 ...
最新文章
- 10 个免费的 C/C++ 集成开发环境
- 【IOC 控制反转】Android 事件依赖注入 ( 事件依赖注入具体的操作细节 | 获取要注入事件的 View 对象 | 通过反射获取 View 组件的事件设置方法 )
- 数据中心业务价值永续的密码——施耐德电气全生命周期服务
- C#中实现计时器功能(定时任务和计时多长时间后执行某方法)
- android 管理类,android 线程管理类
- “国家科学数据中心”联合专刊征稿
- OpenLayers相关资料
- bzoj 3513: [MUTC2013]idiots【生成函数+FFT】
- CNN更新换代!性能提升算力减半,还即插即用
- 一道数学题引发的思考
- php面试专题---6、正则表达式考点
- asp打开exe执行本地程序._ASP.NET Core json配置文件
- python 苹果id申请_以写代学: python 模拟用户注册或登录账号
- java graham_Graham Scan凸包算法
- Avesta飞秒光纤激光器
- HTML的路径和链接、注释、特殊字符
- AndroidStudio 之Safe Delete 安全删除
- 如何充分利用Composition API对Vue3项目进行代码抽离
- Linux tac命令
- 使用同步锁来实现线程安全---生产者与消费者