传送门

不考虑$a$的影响

设$f(i)$为$i$的约数和

$$ans=\sum\limits_{i=1}^n\sum\limits_{j=1}^nf(gcd(i,j))$$

$$=\sum\limits_{d=1}^nf(d)\sum\limits_{i=1}^{\lfloor \frac n d \rfloor}\sum\limits_{j=1}^{\lfloor \frac m d \rfloor } [gcd(i,j)==1]$$

这个东西直接反演一下

$$=\sum\limits_{d=1}^nf(d)\sum\limits_{i=1}^{\lfloor \frac n d \rfloor}\mu(i) \lfloor \frac n {di} \rfloor \lfloor \frac m {di} \rfloor$$

然后转为枚举$di$

$$=\sum\limits_{D=1}^{n}\sum\limits_{d|D}f(d)\mu(\frac D d) \lfloor \frac n {D} \rfloor \lfloor \frac m {D} \rfloor$$

对于每一个$i$可以用整除分块把它前缀和的贡献算出来,然后用树状数组动态维护前缀和

然后我们考虑$a$的限制。把所有询问离线按$a$排序,从小到大处理处理询问,每处理到一个询问就把所有的$f(d)<=a$的$d$的贡献都累加起来,直接树状数组查询一下就可以了

然后听大佬们说这题取模直接自然溢出就可以了,然后不知道为啥最后还要$\&$一个$0x7fffffff$

 //minamoto
#include<iostream>
#include<cstdio>
#include<algorithm>
#define ui unsigned int
using namespace std;
#define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
char buf[<<],*p1=buf,*p2=buf;
template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,:;}
inline int read(){
#define num ch-'0'
char ch;bool flag=;int res;
while(!isdigit(ch=getc()))
(ch=='-')&&(flag=true);
for(res=num;isdigit(ch=getc());res=res*+num);
(flag)&&(res=-res);
#undef num
return res;
}
char sr[<<],z[];int C=-,Z;
inline void Ot(){fwrite(sr,,C+,stdout),C=-;}
inline void print(int x){
if(C><<)Ot();if(x<)sr[++C]=,x=-x;
while(z[++Z]=x%+,x/=);
while(sr[++C]=z[Z],--Z);sr[++C]='\n';
}
const int N=1e5;
int p[N];ui mu[N+],f[N+],c[N+],ans[N+];
int a[N+],m,q,n,vis[N+];
struct node{
int n,m,val,id;
node(){}
node(int n,int m,int val,int id):n(n),m(m),val(val),id(id){}
inline bool operator <(const node &b)const
{return val<b.val;}
}t[N];
inline bool cmp(const int &a,const int &b){return f[a]<f[b];}
inline void add(int x,ui y){
for(;x<=N;x+=x&-x) c[x]+=y;
}
inline ui query(int x){
ui res=;
for(;x;x-=x&-x) res+=c[x];
return res;
}
void init(){
mu[]=;
for(int i=;i<=N;++i){
if(!vis[i]) p[++m]=i,mu[i]=-;
for(int j=;j<=m&&p[j]*i<=N;++j){
vis[i*p[j]]=;
if(i%p[j]==) break;
mu[i*p[j]]=-mu[i];
}
}
for(int i=;i<=N;++i)
for(int j=i;j<=N;j+=i)
f[j]+=i;
for(int i=;i<=N;++i) a[i]=i;
sort(a+,a++N,cmp);
}
int main(){
// freopen("testdata.in","r",stdin);
init();
q=read();
for(int i=,x,y,z;i<=q;++i){
x=read(),y=read(),z=read();
if(x>y) swap(x,y);cmax(z,);
t[i]=node(x,y,z,i);
}
sort(t+,t+q+);
for(int i=,j=,k;i<=q;++i){
for(;f[a[j]]<=t[i].val;++j)
for(k=a[j];k<=N;k+=a[j])
add(k,f[a[j]]*mu[k/a[j]]);
for(int l=,r;l<=t[i].n;l=r+){
r=min(t[i].n/(t[i].n/l),t[i].m/(t[i].m/l));
ans[t[i].id]+=(t[i].n/l)*(t[i].m/l)*(query(r)-query(l-));
}
}
for(int i=;i<=q;++i) print(ans[i]&0x7fffffff);
Ot();
return ;
}

洛谷P3312 [SDOI2014]数表(莫比乌斯反演+树状数组)的更多相关文章

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

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

  2. 【BZOJ3529】[Sdoi2014]数表 莫比乌斯反演+树状数组

    [BZOJ3529][Sdoi2014]数表 Description 有一张N×m的数表,其第i行第j列(1 < =i < =礼,1 < =j < =m)的数值为能同时整除i和 ...

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

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

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

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

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

  6. BZOJ3529: [Sdoi2014]数表(莫比乌斯反演 树状数组)

    题意 题目链接 Sol 首先不考虑\(a\)的限制 我们要求的是 \[\sum_{i = 1}^n \sum_{j = 1}^m \sigma(gcd(i, j))\] 用常规的套路可以化到这个形式 ...

  7. luogu3312 [SDOI2014]数表 (莫比乌斯反演+树状数组)

    link \(\sum_{i=1}^n\sum_{j=1}^m[s(\gcd(i,j))\le a]s(\gcd(i,j))\) \(=\sum_{p=1}^ns(p)[s(p)\le a]\sum_ ...

  8. bzoj 3529 数表 莫比乌斯反演+树状数组

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

  9. 洛谷 P3312 [SDOI2014]数表 解题报告

    P3312 [SDOI2014]数表 题目描述 有一张\(N*M\)的数表,其第\(i\)行第\(j\)列(\(1\le i \le n\),\(1 \le j \le m\))的数值为能同时整除\( ...

随机推荐

  1. JSP之Model1

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/ ...

  2. EasyIPCamera高性能摄像机RTSP服务器RTSPServer解决方案

    EasyIPCamera EasyIPCamera是由EasyDarwin团队开发的一套非常稳定.易用.支持多种平台(包括Windows/Linux 32&64,Android,ARM his ...

  3. Darwin Streaming Server编译

    EasyDarwin是我们在Darwin Streaming Server的基础上进行开发和扩展的,Windows/Linux编译,包括64位编译补丁,我们都进行了整理和测试,后续还会不断进行迭代和扩 ...

  4. 九度OJ 1142:Biorhythms(生理周期) (中国剩余定理)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:266 解决:189 题目描述: Some people believe that there are three cycles in a p ...

  5. java读流方式,下载网络上的图片

    本工具类支持url的list集合,具体实现如下所示: public static void download(ArrayList<String> listUrl, String downl ...

  6. Cocos2d-x之CCMenu理解

    Menu创建菜单: Cocos2d-x下的菜单创建包括: 1.CCMenuItemFont    字体按钮创建 CCMenuItemFont * onlineVideo = MenuItemFont: ...

  7. Docker的跨主机连接:

    1使用网桥实现跨主机容器连接. 2使用open vswitch虚礼的交换机实现跨主机容器连接. 3使用weave开源项目工具实现跨主机连接. 使用网桥实现跨主机容器连接:在同一个docker的主机中d ...

  8. windows server 2008 + IIS 7.5实现多用户FTP(多账号对应不同目录

    在windows server 2003 + IIS 6 的时候,就已经能实现多用户FTP的功能,不过设置有写繁琐,如果站点多的话,设置账号.权限这些东西都要搞很久.Windows server 20 ...

  9. U盘安装Ubuntu 14.04 LTS正式版

    Ubuntu 14.04 LTS正式版发布,而且提供五年的支持和维护服务.Ubuntu 14.04是Ubuntu开发团队历经五年的心血之作.许多新手都喜欢把Linux安装文件刻录成光盘再安装,而安装好 ...

  10. 「LOJ#10015」「一本通 1.2 练习 2」扩散(并查集

    题目描述 一个点每过一个单位时间就会向 444 个方向扩散一个距离,如图所示:两个点 a .b 连通,记作 e(a,b),当且仅当 a .b的扩散区域有公共部分.连通块的定义是块内的任意两个点 u.v ...