【BZOJ3529】[Sdoi2014]数表 莫比乌斯反演+树状数组
【BZOJ3529】[Sdoi2014]数表
Description
有一张N×m的数表,其第i行第j列(1 < =i < =礼,1 < =j < =m)的数值为能同时整除i和j的所有自然数之和。给定a,计算数表中不大于a的数之和。
Input
输入包含多组数据。
    输入的第一行一个整数Q表示测试点内的数据组数,接下来Q行,每行三个整数n,m,a(|a| < =10^9)描述一组数据。
Output
对每组数据,输出一行一个整数,表示答案模2^31的值。
Sample Input
4 4 3
10 10 5
Sample Output
148
HINT
1 < =N.m < =10^5 , 1 < =Q < =2×10^4
题解:首先我们要知道一个数的约数和是nloglogn级别的,所以先不考虑a的限制,我们还是采用熟悉的莫比乌斯反演。
$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_{e=1}^{\lfloor \frac n d \rfloor}\mu(e) \lfloor \frac n {de} \rfloor \lfloor \frac m {de} \rfloor\\=\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$
那么如果考虑a的限制呢?我们将所有询问离线,按a排序,然后从小到大处理所有询问,每处理到一个询问,就将所有f(d)<=a的d的贡献都统计出来。也就是说我们需要用某个数据结构来维护f*mu的前缀和,树状数组即可。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int N=100000;
typedef unsigned int ui;
int pri[N/10];
ui mu[N+10],f[N+10],s[N+10],ans[N];
int q[N+10];
int num,Q;
bool np[N+10];
struct node
{
int n,m,a,org;
}p[N];
inline int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc<'0'||gc>'9') {if(gc=='-') f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+(gc^'0'),gc=getchar();
return ret*f;
}
bool cmp(const node &a,const node &b)
{
return a.a<b.a;
}
bool cmpq(const int &a,const int &b)
{
return f[a]<f[b];
}
inline void updata(int x,ui val)
{
for(int i=x;i<=N;i+=i&-i) s[i]+=val;
}
inline ui query(int x)
{
ui ret=0;
for(int i=x;i;i-=i&-i) ret+=s[i];
return ret;
}
int main()
{
int i,j,k,last;
mu[1]=1;
for(i=2;i<=N;i++)
{
if(!np[i]) pri[++num]=i,mu[i]=-1;
for(j=1;j<=num&&i*pri[j]<=N;j++)
{
np[i*pri[j]]=1;
if(i%pri[j]==0) break;
mu[i*pri[j]]=-mu[i];
}
}
for(i=1;i<=N;i++) for(j=i;j<=N;j+=i) f[j]+=i;
for(i=1;i<=N;i++) q[i]=i;
Q=rd();
for(i=1;i<=Q;i++)
{
p[i].n=rd(),p[i].m=rd(),p[i].org=i;
if(p[i].n>p[i].m) swap(p[i].n,p[i].m);
p[i].a=max(rd(),0);
}
sort(q+1,q+N+1,cmpq);
sort(p+1,p+Q+1,cmp);
for(i=j=1;i<=Q;i++)
{
for(;f[q[j]]<=p[i].a;j++) for(k=q[j];k<=N;k+=q[j]) updata(k,f[q[j]]*mu[k/q[j]]);
for(k=1;k<=p[i].n;k=last+1)
{
last=min(p[i].n/(p[i].n/k),p[i].m/(p[i].m/k));
ans[p[i].org]+=(p[i].n/k)*(p[i].m/k)*(query(last)-query(k-1));
}
}
for(i=1;i<=Q;i++) printf("%u\n",ans[i]&0x7fffffff);
return 0;
}
【BZOJ3529】[Sdoi2014]数表 莫比乌斯反演+树状数组的更多相关文章
- BZOJ3529: [Sdoi2014]数表(莫比乌斯反演 树状数组)
		
题意 题目链接 Sol 首先不考虑\(a\)的限制 我们要求的是 \[\sum_{i = 1}^n \sum_{j = 1}^m \sigma(gcd(i, j))\] 用常规的套路可以化到这个形式 ...
 - BZOJ 3259 [Sdoi2014]数表 (莫比乌斯反演 + 树状数组)
		
3529: [Sdoi2014]数表 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 2321 Solved: 1187[Submit][Status ...
 - BZOJ 3529: [Sdoi2014]数表 [莫比乌斯反演 树状数组]
		
3529: [Sdoi2014]数表 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1399 Solved: 694[Submit][Status] ...
 - BZOJ 3529 [Sdoi2014]数表 (莫比乌斯反演+树状数组+离线)
		
题目大意:有一张$n*m$的数表,第$i$行第$j$列的数是同时能整除$i,j$的所有数之和,求数表内所有不大于A的数之和 先是看错题了...接着看对题了发现不会做了...刚了大半个下午无果 看了Po ...
 - 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 ...
 - 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_ ...
 - 【BZOJ3529】【莫比乌斯反演 + 树状数组】[Sdoi2014]数表
		
Description 有一张N×m的数表,其第i行第j列(1 < =i < =礼,1 < =j < =m)的数值为 能同时整除i和j的所有自然数之和.给定a,计算数表中不大于 ...
 - bzoj 3529 数表 莫比乌斯反演+树状数组
		
题目大意: 有一张N×m的数表,其第i行第j列(1 < =i < =礼,1 < =j < =m)的数值为能同时整除i和j的所有自然数之和.给定a,计算数表中不大于a的数之和. ...
 - 【BZOJ3529】【SDOI2014】数表 (莫比乌斯反演+树状数组)
		
传送门 Description 有一张$n\times m$的数表,其第$i$行第$j$列 $(1≤i≤n,1≤j≤m)$ 的数值为能同时整除$i$和$j$的所有自然数之和.现在给定$a$,计算数表中 ...
 
随机推荐
- android DVM
			
android 运行环境主要是虚拟机技术:Dalvik.每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的 Dalvik虚拟机实例.而每一个DVM都是在Linux中的一个进程,所以说 ...
 - e658. 组合图形
			
Area shape = new Area(shape1); shape.add(new Area(shape2)); shape.subtract(new Area(shape3)); shape. ...
 - Unity中的Transform Gizmo中的Pivot和Center
			
选择中心(Center)意味着使用当前所选所有物体的共同轴心, 选择轴心(Pivot)意味着将使用各个物体的实际轴心 区别在于是否选中了多个物体或者有层级关系的物体. 第一张图是Center,中心在组 ...
 - Java处理图片时编译不通过
			
Java中处理图片时,MyEclipse需要导入以下包: import com.sun.image.codec.jpeg.JPEGCodec; import com.sun.image.codec.j ...
 - 在Terminal中的光标的使用技巧
			
如何简单操作? 在 Terminal(终端) 中,有许多操作技巧,这里就介绍几个简单的. 光标 up(方向键上) 可以调出输入历史执行记录,快速执行命令 down(方向键下) 配合 up 选择历史执行 ...
 - 根据多表条件更新表.............. 一条sql语句.............
			
CREATE TABLE a( NAME INT, age int ); CREATE TABLE b( height INT, weight int ); ,); ,); SELECT * FROM ...
 - Linux(Ubuntu)下搭建ASP.NET Core环境
			
今天来学习一下ASP.NET Core 运行在Ubuntu中.无需安装mono . 环境 Ubuntu 14.04.4 LTS 服务器版 全新安装系统. 下载地址:http://mirrors.neu ...
 - Mysql中Innodb大量插入数据时SQL语句的优化
			
innodb优化后,29小时入库1300万条数据 参考:http://blog.51yip.com/mysql/1369.html 对于Myisam类型的表,可以通过以下方式快速的导入大量的数据: A ...
 - chrome调试技巧--持续更新
			
1.开始调试:右键审查元素 2.按钮功能: 调出控制台: 切换开发环境全屏还是嵌入: 清空当前显示: 将压缩 js 文件格式化缩进规整的文件: 3.常用页面功能: 查看.编辑(双击)HTML: 查看选 ...
 - C#实现大数相加
			
在C#中,我们经常需要表示整数.但是,c#的基本数据类型中,最大的long也只能表示-9,223,372,036,854,775,808 到 9,223,372,036,854,775,807之间的数 ...