Description

设d(x)为x的约数个数,给定N、M,求

Input

输入文件包含多组测试数据。

第一行,一个整数T,表示测试数据的组数。

接下来的T行,每行两个整数N、M。

Output

T行,每行一个整数,表示你所求的答案。

Sample Input

2

7 4

5 6

Sample Output

110

121

HINT

1<=N, M<=50000

1<=T<=50000

Solution

莫比乌斯反演

但这题更多的是套路

首先,一个神奇的东东:\(d(nm)= \sum_{i|n}\sum_{j|m}[gcd(i,j)=1]\)

这个东西是个套路,证明的话可以百度,用的确实多

然后就开始推式子

\[\sum_{i=1}^N\sum_{j=1}^Md(ij)=\sum_{i=1}^N\sum_{j=1}^M\sum_{k|i}\sum_{l|j}[gcd(k,l)=1]\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \
\]

\[=\sum_{i=1}^N\sum_{j=1}^M\sum_{k|i}\sum_{l|j}\sum_{d|gcd(k,l)}\mu(d)\ \ \ \ (\sum_{d|n}\mu(d)=[n=1])
\]

\[=\sum_{i=1}^N\sum_{j=1}^M\sum_{d=1}^{min(N,M)}\mu(d)\sum_{k|i}\sum_{l|j}[d|gcd(k,l)]\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \
\]

\[=\sum_{d=1}^{min(N,M)}\mu(d)\sum_{i=1}^N\sum_{j=1}^M\sum_{k|i}\sum_{l|j}[d|gcd(k,l)]\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \
\]

\[=\sum_{d=1}^{min(N,M)}\mu(d)\sum_{k=1}^N\sum_{l=1}^M[d|gcd(k,l)]\lfloor \frac{N}{k} \rfloor \lfloor \frac{M}{l} \rfloor\ \ \ \ \ \ \ \ \ \ \
\]

\[=\sum_{d=1}^{min(N,M)}\mu(d)\sum_{dk=1}^N\sum_{dl=1}^M[d|gcd(dk,dl)]\lfloor \frac{N}{dk} \rfloor \lfloor \frac{M}{dl} \rfloor\ \ \ \
\]

\[=\sum_{d=1}^{min(N,M)}\mu(d)\sum_{k=1}^{\lfloor \frac{N}{d} \rfloor}\sum_{l=1}^{\lfloor \frac{M}{d} \rfloor}\lfloor \frac{N}{dk} \rfloor \lfloor \frac{M}{dl} \rfloor\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \
\]

\[=\sum_{d=1}^{min(N,M)}\mu(d)(\sum_{k=1}^{\lfloor \frac{N}{d} \rfloor}\lfloor \frac{N}{dk} \rfloor)(\sum_{l=1}^{\lfloor \frac{M}{d} \rfloor} \lfloor \frac{M}{dl} \rfloor)\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \
\]

\[=\sum_{d=1}^{min(N,M)}\mu(d)\ f(\lfloor \frac{N}{d} \rfloor)\ f(\lfloor \frac{M}{d} \rfloor)\ \ \ \ (f(i)=\sum_{j=1}^i\lfloor \frac{i}{j} \rfloor)\ \
\]

于是\(\mu\)用线性筛加前缀和,\(f\)整除分块预处理

最后求式子再用整除分块

#include<bits/stdc++.h>
#define ll long long
const int MAXN=50000+10;
int T,cnt,prime[MAXN],mu[MAXN],s[MAXN],f[MAXN];
bool vis[MAXN];
template<typename T> inline void read(T &x)
{
T data=0,w=1;
char ch=0;
while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
if(ch=='-')w=-1,ch=getchar();
while(ch>='0'&&ch<='9')data=((T)data<<3)+((T)data<<1)+(ch^'0'),ch=getchar();
x=data*w;
}
template<typename T> inline void write(T x,char c='\0')
{
if(x<0)putchar('-'),x=-x;
if(x>9)write(x/10);
putchar(x%10+'0');
if(c!='\0')putchar(c);
}
template<typename T> inline void chkmin(T &x,T y){x=(y<x?y:x);}
template<typename T> inline void chkmax(T &x,T y){x=(y>x?y:x);}
template<typename T> inline T min(T x,T y){return x<y?x:y;}
template<typename T> inline T max(T x,T y){return x>y?x:y;}
inline void init()
{
memset(vis,1,sizeof(vis));
vis[0]=vis[1]=0;
mu[1]=1;
for(register int i=2;i<MAXN;++i)
{
if(vis[i])
{
prime[++cnt]=i;
mu[i]=-1;
}
for(register int j=1;j<=cnt&&i*prime[j]<MAXN;++j)
{
vis[i*prime[j]]=0;
if(i%prime[j])mu[i*prime[j]]=-mu[i];
else break;
}
}
for(register int i=1;i<MAXN;++i)s[i]=s[i-1]+mu[i];
for(register int k=1;k<MAXN;++k)
for(register int i=1;;)
{
if(i>k)break;
int j=k/(k/i);
f[k]+=(k/i)*(j-i+1);
i=j+1;
}
}
inline ll solve(int N,int M)
{
ll res=0;
for(register int i=1;;)
{
if(i>min(N,M))break;
int j=min(N/(N/i),M/(M/i));
res+=(ll)f[N/i]*(ll)f[M/i]*(ll)(s[j]-s[i-1]);
i=j+1;
}
return res;
}
int main()
{
read(T);
init();
while(T--)
{
int N,M;
read(N);read(M);
write(solve(N,M),'\n');
}
return 0;
}

【刷题】BZOJ 3994 [SDOI2015]约数个数和的更多相关文章

  1. BZOJ 3994: [SDOI2015]约数个数和

    3994: [SDOI2015]约数个数和 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 898  Solved: 619[Submit][Statu ...

  2. BZOJ 3994: [SDOI2015]约数个数和 [莫比乌斯反演 转化]

    2015 题意:\(d(i)\)为i的约数个数,求\(\sum\limits_{i=1}^n \sum\limits_{j=1}^m d(ij)\) \(ij\)都爆int了.... 一开始想容斥一下 ...

  3. ●BZOJ 3994 [SDOI2015]约数个数和

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3994 题解: 莫比乌斯反演 (先定义这样一个符号[x],如果x为true,则[x]=1,否则 ...

  4. bzoj 3994 [SDOI2015]约数个数和——反演

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3994 \( d(i*j)=\sum\limits_{x|i}\sum\limits_{y|j ...

  5. BZOJ 3994: [SDOI2015]约数个数和3994: [SDOI2015]约数个数和 莫比乌斯反演

    https://www.lydsy.com/JudgeOnline/problem.php?id=3994 https://blog.csdn.net/qq_36808030/article/deta ...

  6. BZOJ.3994.[SDOI2015]约数个数和(莫比乌斯反演)

    题目链接 \(Description\) 求\[\sum_{i=1}^n\sum_{j=1}^md(ij)\] \(Solution\) 有结论:\[d(nm)=\sum_{i|d}\sum_{j|d ...

  7. 【BZOJ 3994】3994: [SDOI2015]约数个数和(莫比乌斯反演)

    3994: [SDOI2015]约数个数和 Description  设d(x)为x的约数个数,给定N.M,求   Input 输入文件包含多组测试数据. 第一行,一个整数T,表示测试数据的组数. 接 ...

  8. [BZOI 3994] [SDOI2015]约数个数和(莫比乌斯反演+数论分块)

    [BZOI 3994] [SDOI2015]约数个数和 题面 设d(x)为x的约数个数,给定N.M,求\(\sum _{i=1}^n \sum_{i=1}^m d(i \times j)\) T组询问 ...

  9. 【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} ...

随机推荐

  1. linux centos7 nginx 安装部署和配置

    1/什么是NginxNginx("enginex")是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器,在高连接并发的情况下Nginx是Apac ...

  2. sketch 相关论文

    sketch 相关论文 Sketch Simplification We present a novel technique to simplify sketch drawings based on ...

  3. Laya 1.x 按文件夹TS代码合并

    Laya 1.x 使用TS开发时,经常会碰到代码文件太多,加载index.html时时间太长的问题.Laya编辑器貌似没有自带JS代码合并的功能.基于Laya去实现JS合并需要修改编辑器源码,合并JS ...

  4. vue处理循环列表动态数据问题

    调用方法:Vue.set( target, key, value ) target:要更改的数据源(可以是对象或者数组) key:要更改的具体数据 value :重新赋的值 <!DOCTYPE ...

  5. jmeter线程组介绍

    Jmeter中的测试计划是一直有的,但可以在右侧修改名字,要开始做具体测试设计前,都需要在测试计划下边添加一个线程组,添加路径为鼠标捕获测试计划后,点击鼠标右键->添加->Threads( ...

  6. ats缓存规则

    一. 用户访问过程:1. ats收到一个用户对web对象的请求;2. 使用该地址, ats尝试着在其对象数据库(缓存)中用被请求对象的地址来定位该对象;3. 如果对象在缓存中, ats会检查该对象是否 ...

  7. XSS-DVWA

    1.反射型 LOW: 没有过滤,直接键入PAYLOAD 查看源码 这里没有任何过滤,使用htmlspecialchars()过滤 结果不弹窗 MEDIUM: LOW等级的方法不奏效了 观察输出可能是过 ...

  8. Windows 8.1 "计算机" 中文件夹清理

    计算机 win8.1 也叫这台电脑 清理文件夹 保留磁盘分区图标 注册表清理 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\ ...

  9. rev命令详解

    基础命令学习目录首页 rev命令将文件中的每行内容以字符为单位反序输出,即第一个字符最后输出,最后一个字符最先输出,依次类推. #cat a.txt wo shi mcw, nihao how do ...

  10. (第十一周)Beta—review阶段成员贡献分

    项目名:食物链教学工具 组名:奋斗吧兄弟 组长:黄兴 组员:李俞寰.杜桥.栾骄阳.王东涵 个人贡献分=基础分+表现分 基础分=5*5*0.5/5=2.5 成员得分如下: 成员 基础分 表现分 个人贡献 ...