【BZOJ3529】【SDOI2014】数表 (莫比乌斯反演+树状数组)
Description
有一张$n\times m$的数表,其第$i$行第$j$列 $(1≤i≤n,1≤j≤m)$ 的数值为能同时整除$i$和$j$的所有自然数之和。
现在给定$a$,计算数表中不大于$a$的数之和。
Input
输入包含多组数据。
输入的第一行一个整数$Q$表示测试点内的数据组数,接下来Q行,每行三个整数$n,m,a(a≤109)$描述一组数据。
Output
题解:
我数学太水了!!又是一道推公式的题:
\begin{aligned}
ans&=\sum^n_{i=1}\sum^m_{j=1}\sum_{d\mid gdc(i,j)}d\\
&=\sum_d^n\sum^{\lfloor\frac{n}{d}\rfloor}_{i=1}\sum^{\lfloor\frac{m}{d}\rfloor}_{j=1}f(d)[gcd(i,j)=1] &(f(d)=\sum_{k\mid d}k)\\
&=\sum_d^n f(d)\sum^{\lfloor\frac{n}{d}\rfloor}_{i=1}\sum^{\lfloor\frac{m}{d}\rfloor}_{j=1}\sum_{k\mid gcd(i,j)}\mu(k)\\
&=\sum_k^n\sum_d^n f(d)\mu(k)\lfloor\frac{n}{kd}\rfloor\lfloor\frac{m}{kd}\rfloor\\
&设 T=kd \\
ans&=\sum_T^n\sum_{d\mid T}f(d)\mu(\frac{T}{d})\lfloor\frac{n}{T}\rfloor\lfloor\frac{m}{T}\rfloor\\
\end{aligned}
前面同样是数论分块,后面依旧是线性筛。
考虑f怎么求
有个约数和定理
若$n=\sum_{i=1}^k p_i^{a_i}$,$p_i$为$n$的质因数,那么$n$的约数和 $f(n)$满足$f(n)=\prod_{i=1}^k\sum_{j=0}^{a_i}p_i^j$
$f$的话首先是个积性函数,我们在筛$\mu$的时候想顺便把这个也筛出来
考虑$f(d)$的值,如果说d是质数的话答案显然是$d+1$,下面讨论$d$为合数的情况
设$d=i*p$,其中$p$为质数
$p\nmid i$,那么$p$和$i$互质,所以$f(d)=f(p)*f(i)$
$p∣i$,设$i=t*p^x$ ,那么根据约数和定理,我们可以得
$$f(i*p) = f(t)f(p^{x+1}) = f(t)\sum\limits_{i=0}^{x+1}p^i$$
然后我们把p0(也就是1)拿出来,得到
$$f(i * p) = f(t) + f(t)*\sum\limits_{i=1}^{x+1}p^i = f(t) + f(t)*f(p^x)*p$$
然后$i = t * p^x$,所以$f(t) * f(p^x) = f(i)$
所以最后就是$f(d) = f(t) + f(i) * p$
然后就可以筛出$f(d)$啦
剩下的东西
现在加上a的限制,其实就是离线处理
我们先将所有的询问按照a的大小排序,然后从小到大处理
因为分块的时候我们要用到的是g(x)的前缀和,所以用一个树状数组来处理
将f(x)排个序,枚举的时候只枚举到f(x)<a,然后枚举另一个约数求出g,丢到树状数组里面去
求答案的时候直接查询就好了
CODE:
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std; #define lowbit(x) (x&-x)
int T,cnt=,maxn,ans[],tmp[];
int f[],pri[],c[],mu[];
bool vis[];
struct Que{
int n,m,a,id;
bool operator<(const Que &b)const{
return a<b.a;
}
}q[]; bool comp(int a,int b){return f[a]<f[b];} void init(){
mu[]=f[]=;
for(int i=;i<=maxn;i++){
if(!vis[i]){
f[i]=i+,mu[i]=-;
pri[++cnt]=i;
}
for(int j=;j<=cnt&&i*pri[j]<=maxn;j++){
vis[i*pri[j]]=true;
if(i%pri[j]==){
mu[i*pri[j]]=;
int t=i;
while(t%pri[j]==)t/=pri[j];
f[i*pri[j]]=f[t]+pri[j]*f[i];
break;
}else{
f[i*pri[j]]=f[i]*f[pri[j]];
mu[i*pri[j]]=-mu[i];
}
}
}
} void add(int x,int y){
while(x<=maxn){
c[x]+=y;
x+=lowbit(x);
}
} int sum(int x){
int ans=;
while(x>=){
ans+=c[x];
x-=lowbit(x);
}
return ans;
} int main(){
scanf("%d",&T);
for(int i=;i<=T;i++){
scanf("%d%d%d",&q[i].n,&q[i].m,&q[i].a);
q[i].id=i;
if(q[i].n>q[i].m)swap(q[i].n,q[i].m);
maxn=max(maxn,q[i].n);
}
init();
sort(q+,q+T+);
for(int i=;i<=maxn;i++)tmp[i]=i;
sort(tmp+,tmp+maxn+,comp);
for(int i=,now=;i<=T;i++){
int n=q[i].n,m=q[i].m,a=q[i].a;
while(now<=maxn&&f[tmp[now]]<=a){
for(int k=;k*tmp[now]<=maxn;k++)
add(k*tmp[now],f[tmp[now]]*mu[k]);
now++;
}
for(int j=,pos;j<=n;j=pos+){
pos=min(n/(n/j),m/(m/j));
ans[q[i].id]+=(n/j)*(m/j)*(sum(pos)-sum(j-));
}
}
for(int i=;i<=T;i++)
printf("%d\n",ans[i]&0x7fffffff);
}
【BZOJ3529】【SDOI2014】数表 (莫比乌斯反演+树状数组)的更多相关文章
- BZOJ3529: [Sdoi2014]数表(莫比乌斯反演 树状数组)
题意 题目链接 Sol 首先不考虑\(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和 ...
- 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的数之和. ...
随机推荐
- SCOPE_IDENTITY和@@IDENTITY[转]
本文转自:http://www.cnblogs.com/daydayupanan/archive/2008/09/04/1283648.html SCOPE_IDENTITY和@@IDENTITY的作 ...
- C#数组协方差
对于任意两个“引用类型”A和B,如果存在从A到B的隐式引用转换或显式引用转换,则也一定存在从数组类型A[R]到数组类型B[R]的相同的引用转换,其中R可以是任何给定的“秩说明符”,但是这两个数组类型必 ...
- 监测UITextField的变化
监测UITextField的变化可以为UIControlEventEditingChanged事件添加target. 我们有时候会需要用到这个需求:输入框输入文本超过xx长度,不再允许输入其他内容! ...
- c#—OpenFileDialog
OpenFileDialog是什么? OpenFileDialog是一个类,实例化此类可以设置弹出一个文件对话框.比如:我们发邮件时需要上传附件的时候,就会弹出一个让我们选择文件的对话框, 我们可以根 ...
- centos 安装 python3 分类链接
上一篇文章描述了如何安装python3,但是在后续安装pip便不断报出缺少各类模块,安装一个又需要依赖另一个,导致安装过程非常繁琐.究其原因,我是安装centos-minimal版本,有许多功能不是完 ...
- 01、Linux介绍
一. Linux介绍 Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户.多任务.支持多线程和多CPU的操作系统.它能运行主要的UNIX工具软件.应用程序和 ...
- iPhone如何设置自定义铃声?无需连接电脑,轻松几步就搞定!
转载自: https://baijiahao.baidu.com/s?id=1594988016778457969&wfr=spider&for=pc 受够了iPhone自带的千篇一律 ...
- 【android】6大布局
线性布局 相对布局 绝对布局 网格布局 表格布局 帧布局
- Thonny -- 简洁的 python 轻量级 IDE
Thonny目前是 树莓派 上 默认的 Python 开发环境. 该 IDE 是 Institute of Computer Science of University of Tartu (爱沙尼亚 ...
- Anaconda的安装、使用以及与PyCharm的链接
初学Python的盆友们是否有这样的疑惑: 选择Python2还是Python3呢?(后者并不完全兼容前者) 听说两者可以同时安装,那怎么管理呢? Python那么丰富的第三方库,一个一个装太麻烦啦 ...