●BZOJ 3994 [SDOI2015]约数个数和
题链:
http://www.lydsy.com/JudgeOnline/problem.php?id=3994
题解:
莫比乌斯反演
(先定义这样一个符号[x],如果x为true,则[x]=1,否则[x]=0)
首先有这么一个结论:
令d(x)表示x的约数的个数,那么
$d(nm)=\sum_{i|n}\sum_{j|m}[gcd(i,j)==1]$
证明:
设$n=p1^{x1}p2^{x2}p3^{x3}\cdots pk^{xk},m=p1^{y1}p2^{y2}p3^{y3}\cdots pk^{yk}$
则$nm=p1^{x1+y1}p2^{x2+y2}p3^{x3+y3}\cdots pk^{xk+yk}$
由约数定理,$d(nm)=(x1+y1+1)(x2+y2+1)(x3+y3+1)\cdots(xk+yk+1)$
再设$i=p1^{a1}p2^{a2}p3^{a3}\cdots pk^{ak},j=p1^{b1}p2^{b2}p3^{b3}\cdots pk^{bk}$
如果gcd(i,j)=1,那么必须满足a1==0或者b1==0,
如果a1==0,则b1有y1种取值,如果b1==0,则a1有x1种取值,同时a1和b1还可以同时为0
那么就有(x1+y1+1)种情况,
即只考虑p1的指数,就有(x1+y1+1)种情况,同时枚举的i,j如果互质的话,后面的a2,b2,a3,b3...也满足这个条件,
所以满足条件的i,j的对数为$\prod (x_i+y_i+1)$ 和约数定理的形式相同。
有了这个结论,我们来化一化求ANS的式子
$ANS=\sum_{n=1}^{N}\sum_{m=1}^{M}d(nm)$
$\quad\quad=\sum_{n=1}^{N}\sum_{m=1}^{M}\sum_{i|n}\sum_{j|m}[gcd(i,j)==1]$
$\quad\quad=\sum_{i=1}^{N}\sum_{j=1}^{M}[gcd(i,j)==1]\lfloor \frac{N}{i} \rfloor \lfloor \frac{M}{j} \rfloor$
同时由于刚刚入门mobius时,有这么一个式子:
$w(x)=\sum_{d|x}\mu(d)$ 若x==1则w(x)=1,否则w(x)=0
所以:$[gcd(i,j)==1]=\sum_{d|gcd(i,j)}\mu(d)$
那么继续:
$ANS=\sum_{i=1}^{N}\sum_{j=1}^{M}\lfloor \frac{N}{i} \rfloor \lfloor \frac{M}{j} \rfloor\sum_{d|gcd(i,j)}\mu(d)$
$\quad\quad=\sum_{d=1}^{min(n,m)}\mu(d)\sum_{i=1}^{N/d}\lfloor \frac{N}{id}\rfloor\sum_{j=1}^{M/d}\lfloor \frac{M}{jd}\rfloor$
令$f(x)=\sum_{i=1}^{x}\lfloor \frac{x}{i}\rfloor$
则$ANS=\sum_{d=1}^{min(n,m)}\mu(d)f(\lfloor \frac{N}{d} \rfloor)f(\lfloor \frac{M}{d} \rfloor)$
而f(x)就是最开始的d(x)的前缀和。。。但是需要预处理的x的范围小了很多,可以用线筛完成。
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#define ll long long
#define MAXN 50050
using namespace std;
ll f[MAXN];
int mu[MAXN];
void Sieve(){
static bool np[MAXN];
static int prime[MAXN],pnt;
f[1]=mu[1]=1;
for(int i=2,tmp,d;i<=50000;i++){
if(!np[i]) prime[++pnt]=i,mu[i]=-1,f[i]=2;
for(int j=1;j<=pnt&&i<=50000/prime[j];j++){
np[i*prime[j]]=1; tmp=i; d=1;
while(tmp%prime[j]==0) tmp/=prime[j],d++;
f[i*prime[j]]=f[tmp]*(d+1);
if(i%prime[j]) mu[i*prime[j]]=-mu[i];
else break;
}
}
for(int i=2;i<=50000;i++)
f[i]+=f[i-1],mu[i]+=mu[i-1];
}
int main(){
Sieve(); ll ans;
int Case,n,m,mini;
scanf("%d",&Case);
while(Case--){
scanf("%d%d",&n,&m);
mini=min(n,m); ans=0;
for(int d=1,last;d<=mini;d=last+1){
last=min(n/(n/d),m/(m/d));
ans+=(mu[last]-mu[d-1])*f[n/d]*f[m/d];
}
printf("%lld\n",ans);
}
return 0;
}
●BZOJ 3994 [SDOI2015]约数个数和的更多相关文章
- BZOJ 3994: [SDOI2015]约数个数和
3994: [SDOI2015]约数个数和 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 898 Solved: 619[Submit][Statu ...
- BZOJ 3994: [SDOI2015]约数个数和 [莫比乌斯反演 转化]
2015 题意:\(d(i)\)为i的约数个数,求\(\sum\limits_{i=1}^n \sum\limits_{j=1}^m d(ij)\) \(ij\)都爆int了.... 一开始想容斥一下 ...
- 【刷题】BZOJ 3994 [SDOI2015]约数个数和
Description 设d(x)为x的约数个数,给定N.M,求 Input 输入文件包含多组测试数据. 第一行,一个整数T,表示测试数据的组数. 接下来的T行,每行两个整数N.M. Output T ...
- bzoj 3994 [SDOI2015]约数个数和——反演
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3994 \( d(i*j)=\sum\limits_{x|i}\sum\limits_{y|j ...
- BZOJ 3994: [SDOI2015]约数个数和3994: [SDOI2015]约数个数和 莫比乌斯反演
https://www.lydsy.com/JudgeOnline/problem.php?id=3994 https://blog.csdn.net/qq_36808030/article/deta ...
- BZOJ.3994.[SDOI2015]约数个数和(莫比乌斯反演)
题目链接 \(Description\) 求\[\sum_{i=1}^n\sum_{j=1}^md(ij)\] \(Solution\) 有结论:\[d(nm)=\sum_{i|d}\sum_{j|d ...
- 【BZOJ 3994】3994: [SDOI2015]约数个数和(莫比乌斯反演)
3994: [SDOI2015]约数个数和 Description 设d(x)为x的约数个数,给定N.M,求 Input 输入文件包含多组测试数据. 第一行,一个整数T,表示测试数据的组数. 接 ...
- [BZOI 3994] [SDOI2015]约数个数和(莫比乌斯反演+数论分块)
[BZOI 3994] [SDOI2015]约数个数和 题面 设d(x)为x的约数个数,给定N.M,求\(\sum _{i=1}^n \sum_{i=1}^m d(i \times j)\) T组询问 ...
- 【BZOJ】3994: [SDOI2015]约数个数和
题意: \(T(1 \le T \le 50000)\)次询问,每次给出\(n, m(1 \le n, m \le 50000)\),求\(\sum_{i=1}^{n} \sum_{j=1}^{m} ...
随机推荐
- C语言总结报告
1.当初你是如何做出选择计算机专业的决定的? 经过一个学期,你的看法改变了么,为什么? 你觉得计算机是你喜欢的领域吗,它是你擅长的领域吗? 为什么? 当初报考计算机专业,是看到计算机专业在当今社会有良 ...
- Exception in thread "main" expected '<document start>', but found BlockMappingStart in 'reader', line 23, column 2: nimbus.host: "master"
平台:centos-6.3-i386 jdk-7u51 storm 0.9.1 python 2.6.6 hadoop 1.2.1 启动storm的时候,遇到这个问题,百度之后,看到大家的解决方案 ...
- Python 3.* print 出现SyntaxError: invalid syntax
很简单,不知道为啥,据说是3.0以后的print都改为了print(); 例如 a=1 print a 上边出错 输入 a=1 print(a) 就正确了
- Beta冲刺Day4
项目进展 李明皇 今天解决的进度 因服务器端未完成登录态维护,故无法进行前后端联动. 明天安排 前后端联动调试 林翔 今天解决的进度 因上课和实验室事务未完成登录态维护 明天安排 完成登录态维护 孙敏 ...
- 【iOS】swift-如何理解 if let 与guard?
著作权归作者所有. 商业转载请联系作者获得授权,非商业转载请注明出处. 作者:黄兢成 链接:http://www.zhihu.com/question/36448325/answer/68614858 ...
- JAVA_SE基础——51.内部类
在Java中,允许在一个类的内部定义类,这样的类称作内部类,这个内部类所在的类称作外部类.根据内部类的位置.修饰符和定义的方式可分为成员内部类.静态内部类.方法(局部内部类)内部类. 内部类:一个类定 ...
- Mac使用brew安装软件
Homebrew官方网站:https://brew.sh/1,安装brew,Mac中打开Termal输入命令: /usr/bin/ruby -e "$(curl -fsSL https:// ...
- DES加密实现的思想及代码
感谢: http://blog.csdn.net/yxstars/article/details/38424021 上面的日志非常清晰的写出了这个DES加密的过程,主要存在初始IP置换,然后中间存在8 ...
- Python内置函数(52)——getattr
英文文档: getattr(object, name[, default]) Return the value of the named attribute of object. name must ...
- 使用Putty实现windows向阿里云的Linux云服务器上传文件
1.首先获取PSCP工具 PuTTY小巧方便.但若需要向网络中的Linux系统上传文件,则可以使用PuTTY官方提供的PSCP工具来实现上传.PSCP是基于ssh协议实现. 可以点击这里下载 2.启动 ...