题面



100

\[Ans=\sum_{i=1}^n\sum_{j=1}^mg(gcd(i,j))
\]

其中,

\[g(d)=\sum_{i|d}i
\]

我们注意到\(gcd(i,j)\)最多有\(O(n)\)种取值,所以我们枚举\(d=gcd(i,j)\);

就有,

\[Ans=\sum_{d=1}^ng(d)*f(d)
\]

其中,\(f(d)\)表示,有多少对\((i,j)\)的最大公约数为\(d\),可以使用莫比乌斯反演求出。

那么,

\[Ans=\sum_{d=1}^ng(d)*\sum_{d|i}\lfloor\frac{n}{i}\rfloor\lfloor\frac{m}{i}\rfloor\mu(\frac{i}{d})
\]

更换主体,

\[Ans=\sum_{i=1}^n\lfloor\frac{n}{i}\rfloor\lfloor\frac{m}{i}\rfloor\sum_{d|i}g(d)*\mu(\frac{i}{d})
\]

令\(h(d)=\sum_{d|i}g(d)*\mu(\frac{i}{d})\),

对于单个询问而言,如果我们知道\(h\)的前缀和,那么就可以\(O(\sqrt n)\)求出答案。

如果\(a\)一定时,我们可以预处理出\(h\)。

但实际上\(a\)不定。

突破口则是本题允许离线;

我们可以对\(a\)偏序,顺便利用树状数组\(c\)维护\(h\),具体是:

对于一个\(g(d)<=a\)的,我们给所有\(c[i*d]\)加上一个\(g(d)*\mu(i)\),然后\(c\)就是当前的\(h\),

其总的复杂度是\(O(\sum_{i=1}^n\frac{n}{i}*logn)\approx O(nlog^2n)\)。

加上询问,那么最终的复杂度是\(O(Q\sqrt nlogn+nlog^2n)\)

Code

#include<bits/stdc++.h>
#define ll long long
#define fo(i,x,y) for(int i=x;i<=y;i++)
#define fd(i,x,y) for(int i=x;i>=y;i--)
using namespace std;
const char* fin="ex3623.in";
const char* fout="ex3623.out";
const int inf=0x7fffffff;
const int maxn=100007;
const ll mo=1ll<<31;
int t,mu[maxn],wu[maxn],p[maxn],ans[maxn];
int c[maxn],g[maxn];
bool bz[maxn];
void modify(int v,int u){for(;v<maxn;v+=v&-v)c[v]=(0ll+u+c[v])%mo;}
int getsum(int v){
ll k=0;
for(;v;v-=v&-v) k+=c[v];
return k%mo;
}
int getsum(int l,int r){return (getsum(r)-getsum(l-1)+mo)%mo;}
struct query{
int n,m,a,id;
}q[maxn];
bool cmp(query a,query b){return a.a<b.a;}
bool cmp1(int a,int b){return wu[a]<wu[b];}
int main(){
freopen(fin,"r",stdin);
freopen(fout,"w",stdout);
scanf("%d",&t);
fo(i,1,t) scanf("%d%d%d",&q[i].n,&q[i].m,&q[i].a),q[i].id=i;
mu[1]=1;
wu[1]=1;
fo(i,2,maxn-1){
if (!bz[i]){
p[++p[0]]=i;
wu[i]=i+1;
mu[i]=-1;
}
fo(j,1,p[0]){
int k=p[j]*i;
if (k>=maxn) break;
bz[k]=true;
if (i%p[j]==0){
mu[k]=0;
wu[k]=wu[i]+p[j]*(wu[i]-wu[i/p[j]]);
break;
}else{
mu[k]=-mu[i];
wu[k]=p[j]*wu[i]+wu[i];
}
}
}
fo(i,1,maxn-1) g[i]=i;
sort(q+1,q+t+1,cmp);
sort(g+1,g+maxn,cmp1);
int l=1;
fo(i,1,t){
while (l<maxn && wu[g[l]]<=q[i].a){
for(int k=g[l];k<maxn;k+=g[l]) modify(k,wu[g[l]]*mu[k/g[l]]);
l++;
}
int n=q[i].n,m=q[i].m;
if (n>m) swap(n,m);
for(int l=1,r;l<=n;l=r+1){
r=min(n/(n/l),m/(m/l));
ans[q[i].id]=(ans[q[i].id]+1ll*getsum(l,r)*(n/l)*(m/l))%mo;
}
}
fo(i,1,t) printf("%d\n",ans[i]);
return 0;
}

【JZOJ3623】【SDOI2014】数表(table) 树状数组+离线+莫比乌斯反演的更多相关文章

  1. [bzoj3529][Sdoi2014]数表_树状数组_莫比乌斯反演

    数表 bzoj-3529 Sdoi-2014 题目大意:n*m的数表,第i行第j列的数是同时整除i和j的所有自然数之和.给定a,求数表中所有不超过a的和. 注释:$1\le n,m \le 10^5$ ...

  2. 2016 Multi-University Training Contest 5 1012 World is Exploding 树状数组+离线化

    http://acm.hdu.edu.cn/showproblem.php?pid=5792 1012 World is Exploding 题意:选四个数,满足a<b and A[a]< ...

  3. SPOJ DQUERY树状数组离线or主席树

    D-query Time Limit: 227MS   Memory Limit: 1572864KB   64bit IO Format: %lld & %llu Submit Status ...

  4. D-query SPOJ 树状数组+离线

    D-query SPOJ 树状数组+离线/莫队算法 题意 有一串正数,求一定区间中有多少个不同的数 解题思路--树状数组 说明一下,树状数组开始全部是零. 首先,我们存下所有需要查询的区间,然后根据右 ...

  5. Necklace HDU - 3874 (线段树/树状数组 + 离线处理)

    Necklace HDU - 3874  Mery has a beautiful necklace. The necklace is made up of N magic balls. Each b ...

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

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

  7. BZOJ1878: [SDOI2009]HH的项链[树状数组 离线]

    1878: [SDOI2009]HH的项链 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 3486  Solved: 1738[Submit][Statu ...

  8. HDU3333 Turing Tree 树状数组+离线处理

    Turing Tree Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  9. HDU 3333 - Turing Tree (树状数组+离线处理+哈希+贪心)

    题意:给一个数组,每次查询输出区间内不重复数字的和. 这是3xian教主的题. 用前缀和的思想可以轻易求得区间的和,但是对于重复数字这点很难处理.在线很难下手,考虑离线处理. 将所有查询区间从右端点由 ...

随机推荐

  1. (Eclipse) 安装Subversion1.82(SVN)插件

    简介    :SVN是团队开发的代码管理工具,它使我们得以进行多人在同一平台之下的团队开发. 解决问题:Eclipse下的的SVN插件安装. 学到    :Eclipse下的的SVN插件安装. 资源地 ...

  2. Cat- Linux必学的60个命令

    1.作用 cat(“concatenate”的缩写)命令用于连接并显示指定的一个和多个文件的有关信息,它的使用权限是所有用户. 2.格式 cat [options] 文件1 文件2…… 3.[opti ...

  3. 创建一个欢迎 cookie 利用用户在提示框中输入的数据创建一个 JavaScript Cookie,当该用户再次访问该页面时,根据 cookie 中的信息发出欢迎信息。

    创建一个欢迎 cookie 利用用户在提示框中输入的数据创建一个 JavaScript Cookie,当该用户再次访问该页面时,根据 cookie 中的信息发出欢迎信息. <html> & ...

  4. Android SDK上手指南:下一步学习方向

    Android SDK上手指南:下一步学习方向 2014-02-28 11:01 核子可乐 译 51CTO 字号:T | T 到目前为止,我们已经介绍过的知识足以帮助大家从非常理想的起点开始进行And ...

  5. 处理iphone的 .play() 不能播放问题

    一.添加音乐 <audio id="Jaudio" src="shake.mp3" preload loop="loop" contr ...

  6. 【DM642学习笔记十】DSP优化记录

    1. 处理的数据先EDMA到片内,具有更高的效率! 以YUV2RGB为例: #pragma DATA_SECTION(onchipBuf0_y,".INTPROCBUFF"); # ...

  7. 关于解码芯片SAA7115及7105的配置 ,FVID与微驱动

    最近因为在做视频处理,所以和解码芯片打交道很多,根据DM642的例程总了一些应该配置的东西. 注:以下的配置均是指AV信号输入,PAL制式输出的条件 (一)关于SAA7115(基于TI的驱动) 结构体 ...

  8. react-native连接华为真机

    android studio的设置:下载google USB Driver 手机部分1.找到手机开发者模式 设置->系统->关于手机->版本号(多次点击出现开发者模式) 提示你已在开 ...

  9. Leetcode443.String Compression压缩字符串

    给定一组字符,使用原地算法将其压缩. 压缩后的长度必须始终小于或等于原数组长度. 数组的每个元素应该是长度为1 的字符(不是 int 整数类型). 在完成原地修改输入数组后,返回数组的新长度. 进阶: ...

  10. Django项目:CRM(客户关系管理系统)--55--46PerfectCRM实现登陆后页面才能访问

    #urls.py """PerfectCRM URL Configuration The `urlpatterns` list routes URLs to views. ...