bzoj3529/洛谷P3312 数表 莫比乌斯反演+树状数组-程序员宅基地

技术标签: 数论  莫比乌斯反演  数学  

题目分析

首先,我们忽略掉 a a 这个条件,设 n < m ,那么我们要求的就是:

i=1nj=1md|gcd(i,j)d ∑ i = 1 n ∑ j = 1 m ∑ d | g c d ( i , j ) d

由于此题跟gcd有关,所以我们猜测这道题要用莫比乌斯反演,所以不管三七二十一把莫比乌斯反演的常见应用列上来:
g(k)=ni=1mj=1[gcd(i,j)==k] g ( k ) = ∑ i = 1 n ∑ j = 1 m [ g c d ( i , j ) == k ]
g(k)=k|dμ(dk)ndmd g ( k ) = ∑ k | d μ ( d k ) ⌊ n d ⌋ ⌊ m d ⌋
F(x) F ( x ) x x 的约数和,则答案就被转化为了 x = 1 n F ( x ) g ( x )
xx=1F(x)x|dμ(dx)ndmd ∑ x = 1 x F ( x ) ∑ x | d μ ( d x ) ⌊ n d ⌋ ⌊ m d ⌋
那么就是 ndndmdx|dF(x)μ(dx) ∑ d n ⌊ n d ⌋ ⌊ m d ⌋ ∑ x | d F ( x ) μ ( d x )
喔~如果是求这个的花,我们可以首先枚举约数,求出 F(x) F ( x ) ,然后打表 x|dF(x)μ(dx) ∑ x | d F ( x ) μ ( d x ) 的前缀和,然后用一个常用分块优化处理前面的 ndndmd ∑ d n ⌊ n d ⌋ ⌊ m d ⌋ (详见 莫比乌斯反演
可是,只有小于等于 a a F ( x ) 才会有贡献,怎么办?
离线!将 F(x) F ( x ) 从小到大排序,将询问按照 a a 从小到大排序,然后使用一个树状数组,动态往树状数组里加 F ( x ) μ ( d x ) ,前缀和就求树状数组前缀和即可。

代码

#include<bits/stdc++.h>
using namespace std;
const int N=100005;
int Q,n,m,lim,tot,now;
struct question{
   int n,m,a,id;}q[20005];
struct hans{
   int v,id;}F[N];
int mu[N],is[N],pri[N],tr[N],ans[20005];
void init() {
    for(int i=1;i<=lim;++i)//预处理F
        for(int j=i;j<=lim;j+=i) F[j].v+=i;
    for(int i=1;i<=lim;++i) F[i].id=i;
    mu[1]=1;
    for(int i=2;i<=lim;++i) {
   //预处理莫比乌斯函数
        if(!is[i]) pri[++tot]=i,mu[i]=-1;
        for(int j=1;j<=tot&&pri[j]*i<=lim;++j) {
            is[i*pri[j]]=1;
            if(i%pri[j]==0) {mu[i*pri[j]]=0;break;}
            else mu[i*pri[j]]=-mu[i];
        }
    }
}
int cmp1(question x,question y) {
   return x.a<y.a;}
int cmp2(hans x,hans y) {
   return x.v<y.v;}
#define lowbit(x) (x&(-x))
void add(int x,int num) {
   while(x<=lim) tr[x]+=num,x+=lowbit(x);}
int query(int x) {
    int re=0;
    while(x) re+=tr[x],x-=lowbit(x);
    return re;
}
void getans(int x) {
    for(int i=1,j;i<=q[x].n;i=j+1) {
   //常用分块优化
        j=min(q[x].n/(q[x].n/i),q[x].m/(q[x].m/i));
        ans[q[x].id]+=(q[x].n/i)*(q[x].m/i)*(query(j)-query(i-1));
    }
}
int main()
{
    scanf("%d",&Q);
    for(int i=1;i<=Q;++i) {
        scanf("%d%d%d",&q[i].n,&q[i].m,&q[i].a);
        q[i].id=i;if(q[i].n>q[i].m) swap(q[i].n,q[i].m);
        lim=max(lim,q[i].n);
    }
    init();
    sort(q+1,q+1+Q,cmp1),sort(F+1,F+1+lim,cmp2);
    now=1;
    for(int i=1;i<=Q;++i) {
        while(now<=lim&&F[now].v<=q[i].a) {
            for(int j=F[now].id;j<=lim;j+=F[now].id)
                add(j,F[now].v*mu[j/F[now].id]);
            ++now;
        }
        getans(i);
    }
    for(int i=1;i<=Q;++i) printf("%d\n",ans[i]&0x7fffffff);
    return 0;
}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/litble/article/details/79501641

智能推荐

Linux安装jdk笔记_openjdk8u-jdk_x64_linux_hotspot_8u312b07.tar.gz-程序员宅基地

文章浏览阅读1.5k次。Linux安装jdk下载由于Oracle下载jdk需要注册账号登录,且速度奇慢,因此可以选择国内镜像,清华镜像https://mirrors.tuna.tsinghua.edu.cn/AdoptOpenJDK/通过wget下载到linux本地wget https://mirrors.tuna.tsinghua.edu.cn/AdoptOpenJDK/8/jdk/x64/linux/OpenJDK8U-jdk_x64_linux_hotspot_8u312b07.tar.gz解压解压到/usr/_openjdk8u-jdk_x64_linux_hotspot_8u312b07.tar.gz

安居客Android项目架构演进-程序员宅基地

文章浏览阅读2w次,点赞15次,收藏64次。本文已授权微信公众号 AndroidDeveloper 独家发布。入职安居客三年从工程师到 Team Leader,见证了 Android 团队一路走来的发展历程。因此有心将这些记录下来与大家分享,也算是对自己三年来一部分工作的总结。希望对大家有所帮助,更希望能得到大家宝贵的建议。三网合并三年前入职时安居客在业务上刚完成了三网合并(新房、二手房、好租和商业地产多个平台多个网站合成现在的 anjuk

MIT 18.06 Linear Algebra 学习笔记-程序员宅基地

文章浏览阅读317次,点赞3次,收藏6次。文章目录Linear Algebra MIT 18.06Lecture 1矩阵乘列向量代表矩阵各列的线性组合Lecture 2高斯消元法高斯消元法的矩阵形式可逆矩阵Lecture 3矩阵乘法的求解矩阵的逆Gauss-Jordan消元法Lecture 4A=LU分解(假设没有行变换)Lecture 5PA=LU(存在行变换,令主元位置不为0)对称矩阵向量空间Lecture 6矩阵列空间Lecture 7矩阵的秩零空间Lecture 8Ax=b有解时b应满足的条件求Ax=b的所有解列满秩时Ax=b的解行满秩时A_18.06 linear algebra

mybatis使用mapper代理的方式操作数据库_是mybatis操作数据库还是mapper操作数据库-程序员宅基地

文章浏览阅读2.9k次,点赞2次,收藏6次。利用mapper 代理的方式操作数据库和上一篇利用传统的方式相比,不需要程序员自己创建 dao 的接口实现类(即:不需要创建userDaoImpl),而是通过 mybatis 代理的方式创建。但是要注意的开发规范: 1、usermapper.xml 文件中 mapper 的 namespace 的值要等于 dao 的接口类的地址2、userDao 方法名和 usermapper.xml_是mybatis操作数据库还是mapper操作数据库

挂载实现:docker容器里nginx访问宿主机文件_docker nginx访问宿主机后段数据-程序员宅基地

文章浏览阅读5.8k次。挂载目录后镜像内就可以共享宿主机里的文件挂载:指的就是将设备文件中的顶级目录连接到 Linux 根目录下的某一目录(最好是空目录),访问此目录就等同于访问设备文件。问题示例:nginx容器如何访问宿主机的项目静态文件。1.查看nginx配置文件中的静态文件的访问地址:2.配置文件中的文件目录,在宿主机中不存在。查看nginx容器内部文件目录。总结:该容器文件夹目录挂载了 宿主机的源目录。(查看容器元数据信息时,没有查到这个映射关系)Project1:Source: /_docker nginx访问宿主机后段数据

js 获取本周一的日期 (yyyy-mm-dd格式)_js中得到本周周一并且格式是yyyymmdd-程序员宅基地

文章浏览阅读1.5k次。var todayDate=new Date();function monday(date){ var nowTime = date.getTime() ; var day = date.getDay() || 7;//周一是每周的第一天 //var day = date.getDay() //周日是每周的第一天 var oneDayTime..._js中得到本周周一并且格式是yyyymmdd

随便推点

解决office2007安装程序找不到 office.zh-cnSetup.xml OFFICELR.CAB OFFICEMUI.MSI OFFICEMUI.XML SET_为啥office2007安装找不到-程序员宅基地

文章浏览阅读1.3k次。安装Microsoft Office Project Standard 2007时出现了小问题,经过百度google一番后才发现安装office2007与安装vs2008有着紧密的联系我的机子之前已经安装过VS2008,所以在安装office2007时总是提示“安装程序找不到 office.zh-cn\*”(例如office.zh-cn\Setup.xml),而在安装目录下明明就有_为啥office2007安装找不到

智能反射面| 关于UPA信道建模_uniform planar array-程序员宅基地

文章浏览阅读1.6w次,点赞36次,收藏234次。前言这篇文章想讲一下 智能反射面中 UPA (uniform planar array)的信道建模。 之前在智能反射面| Matlab代码实现的信道仿真一文中, 很简略地给了一个基本的UPA仿真代码, 这篇更详细地说一下 关于 面天线 的建模。当然了, UPA并不只使用于智能反射面中, 尽管在科研方向上, 为了简化问题, 在MIMO问题中大家假设的往往都是线天线阵(ULA), 但实际中往往都是二维的UPA天线。 而在智能反射面中, 作者们实在无法睁眼说瞎话地假设智能反射面是一个线阵了, 毕竟人家名字里都_uniform planar array

visual hull可见外壳_aldo laurentini visual hull 概念-程序员宅基地

文章浏览阅读519次。visual hull用于简单、快速地获取三维模型。目前,获取三维模型的方式有:利用传统几何构造技术直接构造模型利用三维扫描设备对真实物体进行扫描,进而重建出模型利用从各个视角拍摄的真实物体的多幅图像重建模型.由图像重建三维模型技术又可分为两类:一类是通过多幅深度图像重建模型,另一类是通过多幅照片生成物体的可见外壳visual hull.Laurentini 最早提出了可见外壳(v..._aldo laurentini visual hull 概念

adb命令删除apk,不止是uninstall,卸载内置的app方法_adb卸载apk命令-程序员宅基地

文章浏览阅读1.9w次,点赞10次,收藏42次。用abd命令删除apk,肯定很多人都用uninstalladb uninstall 包名接下来我要讲的是通过/system/app路径来卸载,该方法卸载的是内置的app,则要找到它的路径然后才可以卸载(1):adb root //成功的话会没有显示,如果已经是root,会有英文提示(2): adb remount //remount sucessed 代表成功(3)..._adb卸载apk命令

【项目实训】UE4 C++摄像机设置_ue c++ bindaxis-程序员宅基地

文章浏览阅读1.1k次。(第三周)文章二物件创建h: UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category = "CameraArmComp") class USpringArmComponent* CameraArmComp;//相机臂组件 UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category = "CameraComp") class UCameraComponent* CameraComp;//_ue c++ bindaxis

再谈符号间干扰(一)-程序员宅基地

文章浏览阅读1w次,点赞13次,收藏57次。在对话通信原理系列相关博文中,有这么一篇博文:通信系统之信道,这篇博文里面已经讲过符号间干扰(ISI),发生符号间干扰的原因在于信号带宽大于相干带宽,同一个意思的表达为:发送符号的周期小于最大时延扩展,具体的内容仔细看上面说的那篇博文。为了避免符号间干扰,博文中也提出了一种方案,那就是将高速串行信号变成低速的并行信号,就是进行一个串并转换,经过S/P后,码元速率降低,这样也就可以实现带宽小于相干带..._符号间干扰

推荐文章

热门文章

相关标签