【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

2
4 4 3
10 10 5

Sample Output

20
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]数表 莫比乌斯反演+树状数组的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. iOS边练边学--CALayer,非根层隐式动画,钟表练习

    一.CALayer UIView之所以能显示在屏幕上,完全是因为他内部的一个图层 在创建UIView对象时,UIView内部会自动创建一个图层(即CALayer对象),通过UIView的layer属性 ...

  2. mysql pdo事务

    /* 开始一个事务,关闭自动提交 */直到调用commit结束事务时才提交 $dbh->beginTransaction(); bool PDO::commit ( void ) 提交一个事务, ...

  3. r指定位置插入一列数值

    y<-1:4 data1 <-data.frame(x1=c(1,3,5,7), x2=c(2,4,6,8),x3=c(11,12,13,14),x4=c(15,16,17,18)) da ...

  4. Qt中delete的问题

    最近项目遇到了一个bug,压力测试ui总会崩溃,gdb调试未果,跑到了库函数,无从查起: (gdb)bt #0 0x4146b1e4 in QWidgetPrivate::drawWidget(QPa ...

  5. 几种常见的DIV边框样式

    <html> <head> <title>边框样式</title> </head> <body> <p style=bor ...

  6. python + opencv: 解决不能读取视频的问题

    博主一开始使用python2.7和Opencv2.4.10来获取摄像头图像,程序如下: cap = cv2.VideoCapture(0) ret, frame = cap.read() 使用这个程序 ...

  7. hdu2147 kiki&#39;s game(博弈)

    这个是纳什博弈?不知道怎么看的 依据PN图,从左下角開始推 左下角P 最后一行都是PNPNPN 第一列都是 P N P N P 完了填完即可了 #include<cstdio> int m ...

  8. 安装配置好openstack环境的虚拟机,须要改动ip时,在数据库中同步改动ip的方法

    感谢朋友支持本博客,欢迎共同探讨交流,因为能力和时间有限,错误之处在所难免,欢迎指正. 假设转载,请保留作者信息. 博客地址:http://blog.csdn.net/qq_21398167 原博文地 ...

  9. 最大子数组之和(N)

    int maxSum(int *array, int n) { ]; ; ; ; i < n; i++) { ) newsum += array[i]; else newsum = array[ ...

  10. Linux jstack分析cpu占用100%

    背景: 运行测试程序后,top命令发现某个进程(pid)占用cpu达到100%.   查看哪个线程占用最多资源: ps mp pid -o THREAD,tid,命令查看这个进程下面的所有线程占用情况 ...