二次联通门 : 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]数表相关推荐

  1. BZOJ 3529: [Sdoi2014]数表 莫比乌斯

    3529: [Sdoi2014]数表 Time Limit: 10 Sec  Memory Limit: 512 MB Submit: 1879  Solved: 949 [Submit][Statu ...

  2. 3529: [Sdoi2014]数表 - BZOJ

    Description 有一张N×m的数表,其第i行第j列(1 < =i < =n,1 < =j < =m)的数值为 能同时整除i和j的所有自然数之和.给定a,计算数表中不大于 ...

  3. (每日一题)P3312 [SDOI2014]数表(经典莫比乌斯反演 + 树状数组维护离线询问)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 每日一题(莫反 / 多项式 / 母函数 / 群论) 2021.4.11 莫反 P3312 [SDOI2 ...

  4. 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 ...

  5. [BZOJ3529][Sdoi2014]数表

    [BZOJ3529][Sdoi2014]数表 试题描述 有一张N×m的数表,其第i行第j列(1 < =i < =n,1 < =j < =m)的数值为能同时整除i和j的所有自然数 ...

  6. BZOJ 3531[Sdoi2014]旅行

    BZOJ 3531[Sdoi2014]旅行 题面描述 传送门 题目分析 可以考虑到,如果这个题所有城市都只信一种宗教的话,就是一个sb树剖,直接进行链的查询和修改就能搞定.多个宗教的话,可以有一种暴力 ...

  7. BZOJ 3529 数表(莫比乌斯+树状数组)

    题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3529 题意:有一张n×m的数表,其第i行第j列的数值为能同时整除i和j的所有自然数 ...

  8. 「BZOJ 3529」「SDOI 2014」数表「莫比乌斯反演」

    题意 有一张 \(n\times m\) 的数表,其第\(i\)行第\(j\)列的数值为能同时整除\(i\)和\(j\)的所有自然数之和. \(T\)组数据,询问对于给定的 \(n,m,a\) , 计 ...

  9. [BZOJ 3531] [Sdoi2014] 旅行 【离线+LCT】

    题目链接:BZOJ - 3531 题目分析 题目询问一条路径上的信息时,每次询问有某种特定的文化的点. 每个点的文化就相当于一种颜色,每次询问一条路径上某种颜色的点的信息. 可以使用离线算法, 类似于 ...

最新文章

  1. 10 个免费的 C/C++ 集成开发环境
  2. 【IOC 控制反转】Android 事件依赖注入 ( 事件依赖注入具体的操作细节 | 获取要注入事件的 View 对象 | 通过反射获取 View 组件的事件设置方法 )
  3. 数据中心业务价值永续的密码——施耐德电气全生命周期服务
  4. C#中实现计时器功能(定时任务和计时多长时间后执行某方法)
  5. android 管理类,android 线程管理类
  6. “国家科学数据中心”联合专刊征稿
  7. OpenLayers相关资料
  8. bzoj 3513: [MUTC2013]idiots【生成函数+FFT】
  9. CNN更新换代!性能提升算力减半,还即插即用
  10. 一道数学题引发的思考
  11. php面试专题---6、正则表达式考点
  12. asp打开exe执行本地程序._ASP.NET Core json配置文件
  13. python 苹果id申请_以写代学: python 模拟用户注册或登录账号
  14. java graham_Graham Scan凸包算法
  15. Avesta飞秒光纤激光器
  16. HTML的路径和链接、注释、特殊字符
  17. AndroidStudio 之Safe Delete 安全删除
  18. 如何充分利用Composition API对Vue3项目进行代码抽离
  19. Linux tac命令
  20. 使用同步锁来实现线程安全---生产者与消费者

热门文章

  1. python的魔法方法--__
  2. 【CyberSecurityLearning 35】基础环境搭建
  3. Java 动态修改的数组——ArrayList
  4. linux下改变python的版本
  5. Dockerfile使用,怎么通过Dockerfile完成docker映像配置
  6. 防止电脑自动休眠小妙招
  7. 精选文章 什么是跨域?怎么解决跨域问题?
  8. 备考信息系统项目管理师-----Day2
  9. 【译】Understanding Linked Data Formats
  10. 经验分享 | 通过adbd配置漏洞在安卓设备上提升权限