博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
●BZOJ 3529 [Sdoi2014]数表
阅读量:5294 次
发布时间:2019-06-14

本文共 1904 字,大约阅读时间需要 6 分钟。

题链:

题解:

莫比乌斯反演。

按题目的意思,令$f(i)$表示i的所有约数的和,就是要求:

$ANS=\sum f(gcd(i,j)),满足1 \leq i \leq n,1 \leq j \leq m,且 f(gcd(i,j))\leq a$


首先 $f(i)$ 应该还是比较好推的,利用其为积性函数的特点,可以在线性筛时完成计算。

令$g[k]$表示$gcd(i,j)=k$的$(i,j)$的对数

$G[k]$表示$gcd(i,j)=\lambda k$的$(i,j)$的对数,其值$G[k]=\lfloor \frac{n}{k} \rfloor \lfloor \frac{m}{k} \rfloor$

那么显然,$G[k]$为$g[k]$的倍数关系和函数,

即满足$G[k]=\sum_{k|d} g[d]$

则由莫比乌斯反演得:

$g[k]=\sum_{k|d}\mu(\frac{d}{k})G[d]$

$\quad\quad=\sum_{k|d}\mu(\frac{d}{k})\lfloor \frac{n}{d} \rfloor \lfloor \frac{m}{d} \rfloor$

那么现在,直接从gcd的值的角度出发,ANS可以写成如下形式:

$ANS=\sum_{i=1}^{min(n,m)}f(i)g(i)$

$\quad\quad=\sum_{i=1}^{min(n,m)}f(i)\sum_{i|d}\mu(\frac{d}{i})\lfloor \frac{n}{d} \rfloor \lfloor \frac{m}{d} \rfloor$

然后再化一下:

$\quad\quad=\sum_{d=1}^{min(n,m)}\lfloor \frac{n}{d} \rfloor \lfloor \frac{m}{d} \rfloor\sum_{i|d}f(i)\mu(\frac{d}{i})$

令 $w(d)=\sum_{i|d}f(i)\mu(\frac{d}{i})$

那么$ANS=\sum_{d=1}^{min(n,m)}\lfloor \frac{n}{d} \rfloor \lfloor \frac{m}{d} \rfloor w(d)$

如果不考虑题目中$f(gcd(i,j))\leq a$的限制

我们就可以枚举每个i,然后把其倍数$d=\lambda i$的$w(d)+=f(i)\mu(\frac{d}{i})$

以此计算出所有的w(d),复杂度为O(Nlog_2N)的。

然后那个求ANS的式子就可以运用向下取整的特性进行分块计算,就可以达到每个询问$O(\sqrt N)$的复杂度。

再来考虑有a的限制时的做法,(其实也不麻烦)

离线询问,按a从小到大排序,

同时把f(i)按从小到大排序,

一次遍历每个询问,并把$f(i)$小于当前询问的$a$的$i$按之前的做法:枚举倍数,加入对应的$w(d)$。

但是为了维护好前缀和,以便使用分块计算,

所以用树状数组维护,即把值$f(i)\mu(\frac{d}{i})$加入到树状数组里面。

然后同样的用树状数组查询前缀和就可以继续对当前询问进行分块计算了。

复杂度:

 

#include
#include
#include
#include
#define MAXN 100050using namespace std;struct BIT{ int val[MAXN],N; void Reset(int n){memset(val,0,sizeof(val));N=n;} int Lowbit(int p){return p&-p;} void Modify(int p,int v){ while(p<=N) val[p]+=v,p+=Lowbit(p); } int Query(int p,int ret=0){ while(p) ret+=val[p],p-=Lowbit(p); return ret; }}DT;struct Question{ int n,m,a,id; friend bool operator < (Question A,Question B){ return A.a

 

  

 

转载于:https://www.cnblogs.com/zj75211/p/8270517.html

你可能感兴趣的文章
Hibernate : Disabling contextual LOB creation as createClob() method threw error
查看>>
【bzoj4872】[Shoi2017]分手是祝愿 期望dp
查看>>
字符串元转分
查看>>
thinkphp 防sql注入
查看>>
201521123044 《Java程序设计》第1周学习总结
查看>>
MIT Scheme 的基本使用
查看>>
程序员的“机械同感”
查看>>
在16aspx.com上下了一个简单商品房销售系统源码,怎么修改它的默认登录名和密码...
查看>>
c++回调函数
查看>>
linux下Rtree的安装
查看>>
【Java】 剑指offer(53-2) 0到n-1中缺失的数字
查看>>
Delphi中ListView类的用法
查看>>
bzoj3110: [Zjoi2013]K大数查询 【树套树,标记永久化】
查看>>
[原创]Java 的传值小例子
查看>>
博客第一弹—聊聊HTML的那些事
查看>>
Mysql安装方法及安装问题解决
查看>>
Java动态代理的两种实现方式:
查看>>
PHP trait
查看>>
1_fbauto
查看>>
IO体系、集合体系、多线程、jdbc
查看>>