[BZOJ3529]数表
假设$n\leq m$,我们先不考虑$\leq a$的限制
$\sum\limits_{i=1}^n\sum\limits_{j=1}^m\sigma((i,j))=\sum\limits_{T=1}^n\left\lfloor\frac nT\right\rfloor\left\lfloor\frac mT\right\rfloor\sum\limits_{d|T}\sigma(d)\mu\left(\frac Td\right)$
我们可以线性筛出$g(n)=\sum\limits_{d|n}\mu(d)\mu\left(\frac nd\right)$并$O(\sqrt n)$回答询问
现在加上了$\leq a$的限制,其实就是只计算$\sigma(d)\leq a$的$d$
考虑离线,把所有询问按$a$排序,按$\sigma(d)$从小到大更新$g$(更新$d$的倍数处的$g$)就可以做了
用树状数组维护$g$,时间复杂度$O\left(n\log_2^2n+q\sqrt n\log_2n\right)$
#include<stdio.h>
#include<algorithm>
using namespace std;
typedef long long ll;
const int T=100000;
int pr[T+10],mu[T+10],d[T+10],sd[T+10];
bool np[T+10];
void sieve(){
int i,j,M;
M=0;
mu[1]=1;
d[1]=1;
sd[1]=1;
for(i=2;i<=T;i++){
if(!np[i]){
pr[++M]=i;
mu[i]=-1;
d[i]=i;
sd[i]=i+1;
}
for(j=1;j<=M&&i*pr[j]<=T;j++){
np[i*pr[j]]=1;
if(i%pr[j]==0){
d[i*pr[j]]=d[i]*pr[j];
sd[i*pr[j]]=sd[i/d[i]]*(sd[d[i]]*pr[j]+1);
break;
}
mu[i*pr[j]]=-mu[i];
d[i*pr[j]]=pr[j];
sd[i*pr[j]]=sd[i]*sd[pr[j]];
}
}
}
int s[100010];
int lowbit(int x){return x&-x;}
void add(int x,int d){
while(x<=T){
s[x]+=d;
x+=lowbit(x);
}
}
int query(int x){
int r=0;
while(x){
r+=s[x];
x-=lowbit(x);
}
return r;
}
struct ask{
int n,m,a,i;
}q[100010];
bool operator<(ask a,ask b){return a.a<b.a;}
int p[100010],ans[100010];
bool cmp(int a,int b){return sd[a]<sd[b];}
#define qn q[i].n
#define qm q[i].m
int main(){
sieve();
int m,M,i,j,nex,s;
scanf("%d",&m);
for(i=1;i<=m;i++){
scanf("%d%d%d",&qn,&qm,&q[i].a);
if(qn>qm)swap(qn,qm);
q[i].i=i;
}
sort(q+1,q+m+1);
for(i=1;i<=T;i++)p[i]=i;
sort(p+1,p+T+1,cmp);
M=1;
for(i=1;i<=m;i++){
while(M<=T&&sd[p[M]]<=q[i].a){
for(j=p[M];j<=T;j+=p[M]){
if(mu[j/p[M]])add(j,sd[p[M]]*mu[j/p[M]]);
}
M++;
}
s=0;
for(j=1;j<=qn;j=nex+1){
nex=min(qn/(qn/j),qm/(qm/j));
s+=(qn/j)*(qm/j)*(query(nex)-query(j-1));
}
ans[q[i].i]=s;
}
for(i=1;i<=m;i++)printf("%d\n",ans[i]&2147483647);
}
[BZOJ3529]数表的更多相关文章
- 【BZOJ3529】数表(莫比乌斯反演,树状数组)
[BZOJ3529]数表(莫比乌斯反演,树状数组) 题解 首先不管\(A\)的范围的限制 要求的东西是 \[\sum_{i=1}^n\sum_{j=1}^m\sigma(gcd(i,j))\] 其中\ ...
- 【BZOJ3529】[Sdoi2014]数表 莫比乌斯反演+树状数组
[BZOJ3529][Sdoi2014]数表 Description 有一张N×m的数表,其第i行第j列(1 < =i < =礼,1 < =j < =m)的数值为能同时整除i和 ...
- [bzoj3529][Sdoi2014]数表_树状数组_莫比乌斯反演
数表 bzoj-3529 Sdoi-2014 题目大意:n*m的数表,第i行第j列的数是同时整除i和j的所有自然数之和.给定a,求数表中所有不超过a的和. 注释:$1\le n,m \le 10^5$ ...
- 【BZOJ3529】【莫比乌斯反演 + 树状数组】[Sdoi2014]数表
Description 有一张N×m的数表,其第i行第j列(1 < =i < =礼,1 < =j < =m)的数值为 能同时整除i和j的所有自然数之和.给定a,计算数表中不大于 ...
- 【BZOJ3529】【SDOI2014】 数表
Time Limit: 10 Sec Memory Limit: 512 MB Description 有一张\(n×m\)的数表,其第i行第j列(\(,1 \le i \leq n,1 \le ...
- 【BZOJ3529】【SDOI2014】数表
Time Limit: 1000 ms Memory Limit: 512 MB Description 有一张n×m的数表,其第i行第j列 (1≤i≤n,1≤j≤m)的数值为能同时整除i和j的所有自 ...
- 【BZOJ3529】数表
数表 Description 有一张 n*m 的数表,其第i行第j列(1<=i<=n,1<=j<=m)的数值为能同时整除 i和j的所有自然数之和.给定a,计算数表中不大于a的数 ...
- bzoj千题计划205:bzoj3529: [Sdoi2014]数表
http://www.lydsy.com/JudgeOnline/problem.php?id=3529 有一张n*m的数表,其第i行第j列(1 < =i < =n,1 < =j & ...
- 【SDOI2014】【BZOJ3529】数表
Description 有一张N×m的数表,其第i行第j列(1 < =i < =礼.1 < =j < =m)的数值为 能同一时候整除i和j的全部自然数之和.给定a,计算数表中不 ...
随机推荐
- 随机生成数组函数+nth-element函数
这几天做了几道随机生成数组的题,且需要用nth-elemeng函数,并且都是北航出的多校题…… 首先我们先贴一下随机生成数组函数的代码: unsigned x = A, y = B, z = C; u ...
- mac系统用docker安装oracle数据库
oracle没有mac可用的版本,最好的办法是通过docker安装 一.下载docker 1.通过brew下载 brew cask install docker 2.手动下载(需要vpn) https ...
- canvas_基于canvan绘制的双半圆环进度条
效果图 实现原理: 1.使用canvas绘制两个半圆弧,底图灰色半圆弧和颜色进度圆弧. 2.利用setInterval计时器,逐步改变颜色进度条,达到进度条的效果. 效果代码: <!DOCTYP ...
- 【shell】shell编程(六)-shell函数的应用
linux shell 可以用户定义函数,然后在shell脚本中可以随便调用. shell中函数的定义格式如下: [ function ] funname [()] { action; [return ...
- linux子系统的初始化_subsys_initcall()【转】
转自:http://my.oschina.net/u/572632/blog/305492 目录[-] 概述 section的声明 注册 调用 IN BUILDING 概述 内核选项的解析完成之后,各 ...
- 中断中处理延时及一些函数的调用规则(中断调i2c驱动有感)--中断中的延迟delay与printk函数的冲突【转】
转自:http://blog.csdn.net/psvoldemort/article/details/8222371 1,中断处理程序中不能使用有睡眠功能的函数,如ioremap,kmalloc,m ...
- 如何掌握jQuery插件开发(高能)
在实际开发工作中,总会碰到像滚动,分页,日历等展示效果的业务需求,对于接触过jQuery以及熟悉jQuery使用的人来说,首先想到的肯定是寻找现有的jQuery插件来满足相应的展示需求.目前页面中常用 ...
- Nginx集群配置与redis的session共享策略
一.什么是Nginx? Nginx (engine x) 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器.Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Ramb ...
- [ python ] 类的组合
首先,使用面向对象是一个人狗大战的实例: class Person: def __init__(self, name, hp, aggr, sex): self.name = name self.hp ...
- 我XXXX!!!够了!!!从github拉到dockerhub,再用daocloud加速下载
史上比较曲折的救国方式了... 先在git hub上申请帐号,导入dockerfile. 然后在docker hub上关联git hub帐号作自动构建. 再用daocloud作加速,将docker i ...