●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/C++知识点
1. C++ 数组作为函数参数 在C/C++中,当数组作为函数的参数进行传递时,数组就自动退化为同类型的指针.(在32位系统中,对任意指针求sizeof结果为4) 2. C++ 中const的用法总结 ...
- java实现同步的两种方式
同步是多线程中的重要概念.同步的使用可以保证在多线程运行的环境中,程序不会产生设计之外的错误结果.同步的实现方式有两种,同步方法和同步块,这两种方式都要用到synchronized关键字. 给一个方法 ...
- JAVA_SE基础——43.抽象类
高手勿喷~ 抽象类:当定义一个类时,常常需要定义一些方法来描述该类的行为特征,但有时这些方法的实现方式是无法确定的.例如定义Animal类时,shout()方法用于表示动物的叫声,但是针对不同的动物, ...
- 记一下webstorm快键键
#####新建文件````ctrl+alt+insert````#####结构速写````div>ul>li*4>p | div>h1+p | input:text | div ...
- MHA 安装与简单使用
MHA 在过去几年一直用的比较火,特别是在在传统复制的那个年代.至从有了GTID好像我们也可以把MHA给忘记了,但是很多企业现在还是在用的比较多.每个公司的MHA玩法也不太一样,但是本质都是差不多了. ...
- spring4——IOC之基于注解的依赖注入(DI )
spring容器对于Bean的创建和对象属性的依赖注入提供了注解的支持,让我们在开发中能够更加便捷的实现对象的创建和对象属性的依赖注入.一,对于Bean的创建spring容器提供了以下四个注解的支持: ...
- Python入门之函数的形式参数与实参/参数的具体使用方法
本篇目录: 一. 函数参数之形式参数与实参 二. 函数参数的具体使用 #1.位置参数:按照从左到右的顺序定义的参数 位置形参:必选参数 位置实参:按照位置给形参传值 #2.关键字参数:按照key=va ...
- spark2.1:读取hive中存储的多元组(string,double)失败
这两天和同事一起在想着如何把一个表的记录减少,表记录包含了:objectid(主小区信息),gridid(归属栅格),height(高度),rsrp(主小区rsrp),n_objectid(邻区),n ...
- POJ-3641 Pseudoprime numbers---快速幂
题目链接: https://vjudge.net/problem/POJ-3641 题目大意: 问p是不是伪素数.伪素数条件:①p不是素数.② ap = a (mod p). 思路: 直接快速幂模板+ ...
- [论文阅读] Joint Face Detection and Alignment using Multi-task Cascaded Convolutional Networks(MTCNN)
相关论文:Joint Face Detection and Alignment using Multi-task Cascaded Convolutional Networks 概论 用于人脸检测和对 ...