Description

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

Input

输入包含多组数据。
输入的第一行一个整数Q表示测试点内的数据组数
接下来Q行,每行三个整数n,m,a(|a| < =10^9)描述一组数据。
1 < =N.m < =10^5  , 1 < =Q < =2×10^4

Output

对每组数据,输出一行一个整数,表示答案模2^31的值。

Sample Input

2
4 4 3
10 10 5

Sample Output

20
148

考虑如果a相等,多次询问怎么做。
设$f(x)=\{^{0,x>a}_{\sigma(x),x\le a}$

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

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

$\sum\limits_{d=1}^{n}f(d)\sum\limits_{i=1}^{n/d}\sum\limits_{j=1}^{m/d}[gcd(i,j)=1]$

$\sum\limits_{d=1}^{n}f(d)\sum\limits_{i=1}^{n/d}\sum\limits_{j=1}^{m/d}\sum\limits_{p|gcd(i,j)}\mu(p)$

$\sum\limits_{d=1}^{n}f(d)\sum\limits_{p|n}\mu(p)n/dp*m/dp$

$\sum\limits_{Q=1}^{n}n/Q*m/Q\sum\limits_{d|Q}f(d)\mu(Q/d)$

$g(n)=\sum\limits_{d|n}f(d)\mu(n/d)$

 
预处理出g的前缀和就可以在$O(\sqrt n)$的时间内求出。
现在每次a的值不一样,可以把询问按a排个序。
每插入一个a值相当于修改一些g上的值,且总共需要修改$O(nln)$次。
然后每次还要快速的求g的前缀和,树状数组维护一下g的值即可。
 
代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cstdlib>
using namespace std;
#define N 100050
#define M 100000
typedef unsigned int un;
int prime[N],cnt,miu[N],ys[N],ysh[N],id[N];
un c[N],ans[N];
bool vis[N];
struct A {
int id,n,m,a;
bool operator < (const A &x) const {
return a<x.a;
}
}q[N];
void fix(int x,un v) {for(;x<=M;x+=x&(-x)) c[x]+=v;}
un inq(int x) {un re=0; for(;x;x-=x&(-x)) re+=c[x]; return re;}
inline bool cmp(const int &x,const int &y) {return ysh[x]<ysh[y];}
void init() {
int i,j; miu[1]=1;
for(id[1]=1,i=2;i<=M;i++) {
if(!vis[i]) {
prime[++cnt]=i; miu[i]=-1;
}
for(j=1;j<=cnt&&i*prime[j]<=M;j++) {
int y=i*prime[j]; vis[y]=1;
if(i%prime[j]==0) {miu[y]=0;break;}
miu[y]=-miu[i];
}
id[i]=i;
}
for(i=1;i<=M;i++) for(j=i;j<=M;j+=i) ysh[j]+=i;
sort(id+1,id+M+1,cmp);
}
void add(int x) {
int i;
for(i=x;i<=M;i+=x) {
fix(i,ysh[x]*miu[i/x]);
}
}
un solve(un n,un m) {
int i,lst; if(n>m) swap(n,m); un re=0;
for(i=1;i<=n;i=lst+1) {
lst=min(n/(n/i),m/(m/i));
re+=(n/i)*(m/i)*(inq(lst)-inq(i-1));
}
return re;
}
int main() {
init();
int Q;
scanf("%d",&Q);
int i,j=1;
for(i=1;i<=Q;i++) scanf("%d%d%d",&q[i].n,&q[i].m,&q[i].a),q[i].id=i;
sort(q+1,q+Q+1);
for(i=1;i<=Q;i++) {
while(ysh[id[j]]<=q[i].a&&j<=M) add(id[j]),j++;
ans[q[i].id]=solve(q[i].n,q[i].m);
}
for(i=1;i<=Q;i++) printf("%u\n",ans[i]&((1u<<31)-1));
}

BZOJ_3529_[Sdoi2014]数表_莫比乌斯反演+树状数组的更多相关文章

  1. 洛谷P3312 [SDOI2014]数表(莫比乌斯反演+树状数组)

    传送门 不考虑$a$的影响 设$f(i)$为$i$的约数和 $$ans=\sum\limits_{i=1}^n\sum\limits_{j=1}^nf(gcd(i,j))$$ $$=\sum\limi ...

  2. 【BZOJ3529】【SDOI2014】数表 (莫比乌斯反演+树状数组)

    传送门 Description 有一张$n\times m$的数表,其第$i$行第$j$列 $(1≤i≤n,1≤j≤m)$ 的数值为能同时整除$i$和$j$的所有自然数之和.现在给定$a$,计算数表中 ...

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. Sping Boot入门到实战之实战篇(二):一些常用功能的Spring Boot Starters

    包含功能 阿里云消息服务MNS 阿里云消息队列服务(即时消息.延迟消息.事务消息) AOP日志 基于MyBatis通用Mapper及DRUID的数据库访问 dubbo支持 错误处理 七牛图片服务 re ...

  2. Windows 命令集合

    查看端口占用 查看8080端口使用情况: C:\>netstat -aon|findstr "8080" 结果:TCP    0.0.0.0:8080           0 ...

  3. JavaScript系列问题

    JavaScript系列问题:  0.javascript 基础教程[温故而知新一] 1.通过JS变更页面字体的大小 2.图片压缩优化能有效提高网站浏览速度

  4. Android模糊效果总结

    1. 软件模糊 用软件的方法.利用cpu计算,无sdk版本号要求. 效果图: 关键模糊代码 github链接 原文 链接 译文 链接 演示样例 代码 本文地址 :http://blog.csdn.ne ...

  5. leetcode笔记:Pow(x, n)

    一. 题目描写叙述 Implement pow(x, n). 二. 题目分析 实现pow(x, n).即求x的n次幂. 最easy想到的方法就是用递归直接求n个x的乘积,这里须要依据n的值,推断结果是 ...

  6. maven依赖本地非repository中的jar包【转】

    今天在使用maven编译打包一个web应用的时候,碰到一个问题: 项目在开发是引入了依赖jar包,放在了WEB-INF/lib目录下,并通过buildpath中将web libariary导入. 在e ...

  7. mac上完整卸载删除.简单粗暴无脑:androidstudio删除方案

    如果你是mac  ,你删除as ,删不干净也正常,你会发现安装的时候,前面的东西也在.配置文件在,会导致你以前的错误不想要的东西都在. 废话不多说,复制粘贴就是干!!!!~~~~~~~~ 第一步: 复 ...

  8. zookeeper curator ( 实战一)

    目录 zookeeper 的伪集群搭建 写在前面 1.1. zookeeper 安装&配置 1.1.1. 创建数据目录和日志目录: 1.1.2. 创建myid文件 1.1.3. 创建和修改配置 ...

  9. 已知段地址,求CPU寻址范围

    已知段地址为0001H,仅通过变化偏移地址寻址,则CPU的寻址范围是? 物理地址 = 段地址×16 + 偏移地址 所以物理地址的范围是[16×1H+0H, 16×1H+FFFFH] 也就是[10H×1 ...

  10. Gemini.Workflow 双子工作流入门教程二:定义流程:流程节点介绍

    简介: Gemini.Workflow 双子工作流,是一套功能强大,使用简单的工作流,简称双子流,目前配套集成在Aries框架中. 下面介绍本篇教程:流程定义:流程节点属性. 流程节点: 左侧是节点工 ...