题链:

http://www.lydsy.com/JudgeOnline/problem.php?id=3529

题解:

莫比乌斯反演。

按题目的意思,令$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<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define MAXN 100050
using 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<B.a;
}
}Q[MAXN];
int f[MAXN],fi[MAXN],mu[MAXN],ANS[MAXN];
bool cmp(int i,int j){
return f[i]<f[j];
}
void Sieve(){
static bool np[MAXN];
static int prime[MAXN],pnt,tmp;
mu[1]=f[1]=fi[1]=1;
for(int i=2;i<=100000;i++){
fi[i]=i;
if(!np[i]) prime[++pnt]=i,mu[i]=-1,f[i]=1+i;
for(int j=1;j<=pnt&&i<=100000/prime[j];j++){
np[i*prime[j]]=1;
if(i%prime[j]){
mu[i*prime[j]]=-mu[i];
f[i*prime[j]]=f[i]*f[prime[j]];
}
else{
mu[i*prime[j]]=0;
tmp=i; while(!(tmp%prime[j])) tmp=tmp/prime[j];
f[i*prime[j]]=f[i]*prime[j]+f[tmp];
}
if(i%prime[j]==0) break;
}
}
sort(fi+1,fi+100000+1,cmp);
}
int main(){
Sieve(); int Case,ret,mini,n,m;
scanf("%d",&Case);
DT.Reset(100000);
for(int i=1;i<=Case;i++)
scanf("%d%d%d",&Q[i].n,&Q[i].m,&Q[i].a),Q[i].id=i;
sort(Q+1,Q+Case+1);
for(int q=1,p=1;q<=Case;q++){
while(p<=100000&&f[fi[p]]<=Q[q].a){
for(int d=fi[p];d<=100000;d+=fi[p])
DT.Modify(d,f[fi[p]]*mu[d/fi[p]]);
p++;
}
ret=0; n=Q[q].n; m=Q[q].m; mini=min(n,m);
for(int i=1,last;i<=mini;i=last+1){
last=min(n/(n/i),m/(m/i));
ret+=(DT.Query(last)-DT.Query(i-1))*(n/i)*(m/i);
}
ANS[Q[q].id]=ret;
}
for(int i=1;i<=Case;i++)
printf("%d\n",ANS[i]&(int)((1ll<<31)-1));
return 0;
}

  

●BZOJ 3529 [Sdoi2014]数表的更多相关文章

  1. BZOJ 3529: [Sdoi2014]数表 [莫比乌斯反演 树状数组]

    3529: [Sdoi2014]数表 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1399  Solved: 694[Submit][Status] ...

  2. bzoj 3529 [Sdoi2014]数表(莫比乌斯反演+BIT)

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

  3. 【刷题】BZOJ 3529 [Sdoi2014]数表

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

  4. BZOJ 3529 [Sdoi2014]数表 (莫比乌斯反演+树状数组+离线)

    题目大意:有一张$n*m$的数表,第$i$行第$j$列的数是同时能整除$i,j$的所有数之和,求数表内所有不大于A的数之和 先是看错题了...接着看对题了发现不会做了...刚了大半个下午无果 看了Po ...

  5. bzoj 3529: [Sdoi2014]数表

    #include<cstdio> #include<iostream> #include<algorithm> #define M 200009 //#define ...

  6. BZOJ 3529 [Sdoi2014]数表 ——莫比乌斯反演 树状数组

    $ans=\sum_{i=1}^n\sum_{j=1}^n\sigma(gcd(i,j))$ 枚举gcd为d的所有数得到 $ans=\sum_{d<=n}\sigma(d)*g(d)$ $g(d ...

  7. BZOJ 3259 [Sdoi2014]数表 (莫比乌斯反演 + 树状数组)

    3529: [Sdoi2014]数表 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 2321  Solved: 1187[Submit][Status ...

  8. 3529: [Sdoi2014]数表 - BZOJ

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

  9. 【BZOJ】3529: [Sdoi2014]数表

    题意:求 $$\sum_{i=1}^{n} \sum_{j=1}^{m} \sum_{d|(i, j)} d 且 (\sum_{d|(i, j)} d)<=a$$ n, m<=1e5,q次 ...

随机推荐

  1. 项目Alpha冲刺Day10

    一.会议照片 二.项目进展 1.今日安排 解决前后台联调问题,完善全局的请求和路由跳转处理,添加空文件完善路由信息,优化界面跳转等待.完成个人信息和修改密码.修改前台数据组织和方法调用方式.解决登录和 ...

  2. 每日冲刺报告--Day2

    敏捷冲刺每日报告--Day2 情况简介 今天我们三个人在一起开了会,分析了我们面临的情况以及下一阶段的计划.一个重大的改进是,我们准备把之前用txt文件格式存储订阅列表改成了文件json格式. 任务进 ...

  3. 201621123057 《Java程序设计》第9周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 在上一周的总结上做了一点补充 1.2 选做:收集你认为有用的代码片段 2. 书面作业 本次作业题集集合 1. ...

  4. OpenGL中怎么把世界坐标系变成屏幕坐标系

    对这个3D坐标手动进行OpenGL的四个变换,得到的结果就是屏幕上的像素坐标.前三个变换(Model, View, Projection)都是4x4矩阵,操作对象是四维向量,所以需要把(100, 10 ...

  5. ThreadLocal源码分析:(三)remove()方法

    在ThreadLocal的get(),set()的时候都会清除线程ThreadLocalMap里所有key为null的value. 而ThreadLocal的remove()方法会先将Entry中对k ...

  6. tomca配置文件自动还原问题的解决 server.xml content.xml 等

    当我们在处理中文乱码或是配置数据源时,我们要修改Tomcat下的server.xml和content.xml文件. 但是当我们修改完后重启Tomcat服务器时发现xml文件又被还原了,修改无效果. 为 ...

  7. 赛码网算法: 上台阶 ( python3实现 、c实现)

    上台阶 题目描述 有一楼梯共m级,刚开始时你在第一级,若每次只能跨上一级或二级,要走上第m级,共有多少走法?注:规定从一级到一级有0种走法. 输入输入数据首先包含一个整数n(1<=n<=1 ...

  8. slf4j入门

    一.官方说明: The Simple Logging Facade for Java (SLF4J) serves as a simple facade or abstraction for vari ...

  9. 浅谈 Mybatis中的 ${ } 和 #{ }的区别

    好了,真正做开发也差不多一年了.一直都是看别人的博客,自己懒得写,而且也不会写博客,今天就开始慢慢的练习一下写博客吧.前段时间刚好在公司遇到这样的问题. 一.举例说明 select * from us ...

  10. 页面获取Web控件ID不能正常获取,它惹得祸

    今天碰到个比较奇葩的问题,因为动了一下目标框架,又原来的4.5.1改为3.5,然后又改回来了4.5.1,结果运行项目的时候发现界面js的计算,不能正常获值计算. 于是就开始找问题呗,先是发现这个二手项 ...