Description

设\(d(x)\)为\(x\)的约数个数,给定\(N,M\),求$$\sum_{i=1}{N}\sum_{j=1}{M}d(ij)$$。

Input

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

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

接下来的\(T\)行,每行两个整数\(N,M\)。

Output

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

Sample Input

2

7 4

5 6

Sample Output

110

121

HINT

\(1 \le N, M \le 50000\)

\(1 \le T \le 50000\)

这题有个很屌的结论:$$\sum_{i=1}{N}\sum_{j=1}{M}d(ij)=\sum_{i=1}{N}\sum_{j=1}{M}\lfloor\frac{N}{i}\rfloor\lfloor\frac{M}{j}\rfloor\lbrack gcd(i,j)=1 \rbrack$$

根据PoPoQQQ博客所说的,我们可以先证明这个式子的成立:$$d(nm)=\sum_{i \mid n}\sum_{j \mid m}\lbrack gcd(i,j)=1 \rbrack$$

我们可以证明一下:我们对每个质数\(p\)单独算贡献,设\(n=n’ \times p^{k_{1}}\),\(m=m’ \times p^{k_{2}}\)。那么,该质数\(p\)对答案的贡献显然为\(k_{1}+k_{2}+1\)。于是我们考虑$$d(nm)=\sum_{i \mid n}\sum_{j \mid m}\lbrack gcd(i,j)=1 \rbrack$$这个式子,发现\(p\)对之有贡献的数对\((i,j)\)仍然是$$(p{k_{1}},1),(p{k_{1}-1},1) \cdots (1,1) \cdots (1,p{k_{2}-1}),(1,p{k_{2}})$$这\(k_{1}+k_{2}+1\)个,因此得证。

代入得$$ \sum_{n = 1}^{N}\sum_{m = 1}^{M}d(nm) = \sum_{n = 1}^{N}\sum_{m = 1}^{M}\sum_{i \mid n} \sum_{j \mid m}[gcd(i,j)=1]$$

我们转变枚举量,先枚举\(i,j\)就有

\[\sum_{i=1}^{N}\sum_{j=1}^{M}\lfloor\frac{N}{i}\rfloor\lfloor\frac{M}{j}\rfloor\lbrack gcd(i,j)=1 \rbrack
\]

于是$$\sum_{i=1}{N}\sum_{j=1}{M}\lfloor\frac{N}{i}\rfloor\lfloor\frac{M}{j}\rfloor\lbrack gcd(i,j)=1 \rbrack$$这个式子我们可以上反演了。

反演化为$$\sum_{i=1}{N}\sum_{j=1}{M}\lfloor\frac{N}{i}\rfloor\lfloor\frac{M}{j}\rfloor \sum_{g \mid i;g \mid j} \mu(g)$$

转而枚举\(g\),于是就可得到$$\sum_{g=1}{N}\mu(g)\sum_{i=1}{\lfloor \frac{N}{g} \rfloor}\sum_{j=1}^{\lfloor \frac{M}{g} \rfloor}\lfloor \frac{N}{ig} \rfloor\lfloor \frac{M}{jg} \rfloor$$

再化一下就可得到$$\sum_{g=1}{N}\mu(g)\sum_{i=1}{\lfloor \frac{N}{g} \rfloor}\lfloor \frac{N}{ig} \rfloor\sum_{j=1}^{\lfloor \frac{M}{g} \rfloor}\lfloor \frac{M}{jg} \rfloor$$

又有$$\lfloor \frac{N}{ab} \rfloor=\lfloor \frac{\lfloor \frac{N}{a} \rfloor}{b} \rfloor$$

于是我们发现\(\sum_{i=1}^{\lfloor \frac{N}{g} \rfloor}\lfloor \frac{N}{ig} \rfloor\)只与\(\lfloor \frac{N}{g} \rfloor\)有关,我们可以\(O(n \sqrt{n})\)预处理$$f_{x}=\sum_{i=1}^{x}\lfloor \frac{x}{i} \rfloor$$

有了这个后再化简$$\sum_{g=1}^{N}\mu(g)f_{\lfloor \frac{N}{g} \rfloor}f_{\lfloor \frac{M}{g} \rfloor}$$就可在\(O(\sqrt{n})\)分段求了。皆大欢喜。

#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std; typedef long long ll;
#define maxn (50010)
int f[maxn],mu[maxn],prime[maxn],n,m,tot; bool exist[maxn]; inline int calc(int x)
{
int ret = 0;
for (int i = 1,last;i <= x;i = last+1)
{
last = min(x,x/(x/i));
ret += (x/i)*(last-i+1);
}
return ret;
}
inline void ready()
{
mu[1] = 1;
for (int i = 2;i <= 50000;++i)
{
if (!exist[i]) { prime[++tot] = i; mu[i] = -1; }
for (int j = 1;j <= tot&&prime[j]*i <= 50000;++j)
{
exist[i*prime[j]] = true;
if (i % prime[j] == 0) { mu[i*prime[j]] = 0; break; }
mu[i*prime[j]] = -mu[i];
}
}
for (int i = 1;i <= 50000;++i) mu[i] += mu[i-1],f[i] = calc(i);
} inline ll work()
{
if (n > m) swap(n,m);
ll ret = 0;
for (int i = 1,last;i <= n;i = last+1)
{
last = min(n,min(n/(n/i),m/(m/i)));
ret += (ll)(mu[last]-mu[i-1])*((ll)f[n/i]*f[m/i]);
}
return ret;
} int main()
{
freopen("3994.in","r",stdin);
freopen("3994.out","w",stdout);
ready();
int T; scanf("%d",&T);
while (T--) scanf("%d %d",&n,&m),printf("%lld\n",work());
fclose(stdin); fclose(stdout);
return 0;
}

BZOJ 3994 约数个数和的更多相关文章

  1. bzoj 3994 约数个数和 —— 反演+数论分块

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3994 推导过程和这里一样:https://www.cnblogs.com/MashiroSk ...

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

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

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

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

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

  5. bzoj:3994:vijos1949: [SDOI2015]约数个数和

    Description  设d(x)为x的约数个数,给定N.M,求     Input 输入文件包含多组测试数据. 第一行,一个整数T,表示测试数据的组数. 接下来的T行,每行两个整数N.M.   O ...

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

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

  7. 【刷题】BZOJ 3994 [SDOI2015]约数个数和

    Description 设d(x)为x的约数个数,给定N.M,求 Input 输入文件包含多组测试数据. 第一行,一个整数T,表示测试数据的组数. 接下来的T行,每行两个整数N.M. Output T ...

  8. 「BZOJ 3994」「SDOI 2015」约数个数和「莫比乌斯反演」

    题意 设\(d(x)\)为\(x\)的约数个数,求\(\sum_{i=1}^{n}\sum_{j=1}^{m}d(ij)\). 题解 首先证个公式: \[d(ij) = \sum_{x|i}\sum_ ...

  9. [SDOI2015][bzoj 3994][Luogu P3327] 约数个数和 (莫比乌斯反演)

    题目描述 设d(x)d(x)d(x)为xxx的约数个数,给定NNN.MMM,求 ∑i=1N∑j=1Md(ij)\sum^{N}_{i=1}\sum^{M}_{j=1} d(ij)i=1∑N​j=1∑M ...

随机推荐

  1. Linux TCP/IP parameters reference

    This is a reference of IP networking parameters that are configurable as described in our linux twea ...

  2. trace openjdk from systemtap

    here are several different tactics to trace openjdk from systemtap. The first relies on sys/sdt.h dt ...

  3. WPF仿微软事件和属性窗体,效果更炫!

    先看效果图:包含系统颜色.系统字体.支持自定义编辑窗体.集合绑定.提供多类型支持. 这是国外网站上无意中看到的,修改了下   感觉还不错!接下来大概介绍下 经过修修改改只留下了有用的主要部分: 前两项 ...

  4. String类的基本用法与注意点,StringBuffer类的用法

    package cn.hncu.day8; public class RegExpDemo { public static void main(String[] args) { String str ...

  5. 利用Gulp实现JSDoc 3的文档编写过程中的实时解析和效果预览

    ### 利用Gulp实现JSDoc 3的文档编写过程中的实时解析和效果预览 http://segmentfault.com/a/1190000002583569

  6. android js 互调

    public class BoatsActivity extends Activity { Handler mHandler = new Handler();//处理消息的handler @Suppr ...

  7. php 5.3起弃用session_register

    最近下了dedecms V5.7时,在登陆后台时,用户名和密码也没错,就是跳转不走,进不了后台管理页面,追踪了好久才发现根目录/include/userlogin.class.php中289行左右的位 ...

  8. SQL语句中格式化时间

    给数据库中的字段格式化(): to_char(CREATETIME,'yyyy-MM-dd') 给程序中的字段格式化(InTime为数据库字段): InTime = to_date( '" ...

  9. 码表 Unicode GBK UTF8 示例

    Unicode的编码形式与对应的字符串相互转换 /**  * Unicode的编码形式与对应的字符串相互转换  * @author 白乾涛  */ public class UnicodeUtils  ...

  10. php 这门语言

    1,基本语法 php在解析一个文件时,会查找开始和结束标记,在开始标记和结束标记之外的会被php引擎忽略 注释:使用 // 和 /*这里是注释*/ 2,php 数据类型 整形 (2345) 浮点型(3 ...