莫比乌斯反演学习笔记
MarchKid_Joe
·
2023-01-06 18:13:49
·
个人记录
莫比乌斯反演
std 文件
目录
std文件
筛法
Eratosthenes 筛
Euler 筛
杜教筛
积性函数
数论分块
狄利克雷卷积
定义
重要结论
狄利克雷卷积
狄利克雷前缀和
狄利克雷后缀和
逆狄利克雷前缀和
逆狄利克雷后缀和
积性函数
积性函数
莫比乌斯函数
欧拉函数
约数个数
约数和
恒等函数
莫比乌斯反演
欧拉反演
Problem
链接
重题
幽灵乐团
常用套路
枚举 \gcd
数论分块
透彻了解积性函数的定义
换元替换枚举项
枚举倍数
狄利克雷卷积和前缀和
数据结构优化
筛法
根号分治
后言
筛法
Eratosthenes 筛(埃氏筛法)
描述
Eratosthenes 筛法,最简单的筛法,具体过程是每筛到一个素数,便把它的整数倍标记,时间复杂度 O(n\log\log n) 。
性质及优点
每个合数会被其所有质因数 筛到;每个合数第一次会被其最小的质因数 筛到。
优点:因为没有取模运算,常数较小,在小范围内可能比 O(n) 线性筛快。
Code
void Eratosthenes(int n)
{
vis[1] = true;
for (int i = 2 ; i <= n ; i ++)
{
if (! vis[i])
prime[++ cnt] = i;
for (int j = i * 2 ; j <= n ; j += i)
vis[j] = true;
}
}
Euler 筛(线性筛)
描述
Euler 筛,便是我们常用的筛法,可以在线性时间复杂度内快速筛出素数和积性函数,时间复杂度 O(n) 。
性质
每个合数仅会被它的最小质因子筛一次。这个性质很重要,是筛积性函数所必须要了解的。
Code
void Euler(int n)
{
vis[1] = true;
for (int i = 2 ; i <= n ; i ++)
{
if (! vis[i])
prime[++ cnt] = i;
for (int j = 1 ; j <= cnt && i * prime[j] <= n ; j ++)
{
vis[i * prime[j]] = true;
if (i % prime[j] == 0) break;
}
}
}
杜教筛
引入
建议放到后面看,只是因为是筛法就扔到前面了。
对于很大的数据范围无法线性处理,就有了杜教筛这种非线性筛法。
设 f(n) 为要求的函数,g(n) 为参与卷积的函数,S(n)=\displaystyle\sum_{i=1}^{n}f(i) 。
杜教筛的大概流程:寻找一个参与卷积的积性函数,先线性筛一部分需要的积性函数的前缀和,然后采用记忆化的方式求解大数据范围的前缀和。
证明
\begin{aligned}
\displaystyle\sum_{i=1}^{n}(f*g)(i)
&=\displaystyle\sum_{i=1}^{n}\displaystyle\sum_{d\mid i}f(\frac{i}{d})*g(d)\\
&=\displaystyle\sum_{d=1}^{n}\displaystyle\sum_{i=1}^{n}[d\mid i]f(\frac{i}{d})*g(d)\\
&=\displaystyle\sum_{d=1}^{n}g(d)\displaystyle\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}f(\frac{i\times d}{d})\\
&=\displaystyle\sum_{d=1}^{n}g(d)\displaystyle\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}f(i)\\
&=\displaystyle\sum_{d=1}^{n}g(d)S(\lfloor\frac{n}{d}\rfloor)\\
\end{aligned}
然后考虑 g(1)S(n) 如何求:
\begin{aligned}
g(1)S(n)
&=\displaystyle\sum_{i=1}^{n}g(i)S(\lfloor\frac{n}{i}\rfloor)-\displaystyle\sum_{i=2}^{n}g(i)S(\lfloor\frac{n}{i}\rfloor)\\
&=\displaystyle\sum_{i=1}^{n}(f*g)(i)-\displaystyle\sum_{i=2}^{n}g(i)S(\lfloor\frac{n}{i}\rfloor)
\end{aligned}
结论
g(1)S(n)=\displaystyle\sum_{i=1}^{n}(f*g)(i)-\displaystyle\sum_{i=2}^{n}g(i)\times S(\lfloor\frac{n}{i}\rfloor)
积性函数
积性函数
定义
积性函数
函数 f(n) ,满足 f(1) = 1 且 \forall x,y\in N^* ,\gcd(x,y) = 1 ,有 f(x*y)=f(x)*f(y) ,则 f(n) 为积性函数 。
性质 :
f(\prod{p_i^{k_i}})=\prod f({p_i^{k_i}})
完全积性函数
函数 f(n) ,满足 f(1) = 1 且 \forall x,y\in N^* ,有 f(x*y)=f(x)*f(y) ,则 f(n) 为完全积性函数 。
性质 :
f(\prod{p_i^{k_i}})=\prod f({p_i})^{k_i}
常见的积性函数
\begin{aligned}
\mu&:\mu(n)=
\begin{cases}
1&n=1\\
0&\text{n含有平方因子}\\
(-1)^k&\text{k为本质不同的质因子个数}\\
\end{cases}\\
\tau&:\tau(n)=\displaystyle\sum_{i=1}^{n}[i\mid n]\\
\sigma&:\sigma=\displaystyle\sum_{i\mid n}i\\
\varphi&:\varphi(n)=\displaystyle\sum_{i=1}^{n}[\gcd(i,n)=1]\\
1&:1(n)=1\\
\varepsilon&:\varepsilon(n)=[n=1]\\
\operatorname{id}&:\operatorname{id}(n)=n\\
\operatorname{id}&:\operatorname{id_k}(n)=n^k
\end{aligned}
莫比乌斯函数
定义
\mu(n)=
\begin{cases}
1&n=1\\
0&\text{n含有平方因子}\\
(-1)^k&\text{k为本质不同的质因子个数}\\
\end{cases}
性质
\begin{aligned}
(\mu*1)(n)=\varepsilon(n)=\displaystyle\sum_{d\mid n}\mu(d)=[n=1]\\
\displaystyle\sum_{d\mid n}\mu(d)=
\begin{cases}
1&n=1\\
0&n\not=1\\
\end{cases}
\end{aligned}
线性筛 \mu
\begin{cases}
i=1&\mu(i)=1\\
i\in prime&\mu(i)=-1\\
i\notin prime\land prime\mid i&\mu(i*prime)=0\\
i\notin prime\land prime\nmid i&\mu(i*prime)=\mu(i)\times\mu(prime)=-\mu(i)\\
\end{cases}
Code
void Euler(int n)
{
mu[1] = 1;
vis[1] = 1;
for (int i = 2; i <= n; i++)
{
if (!vis[i])
{
p.emplace_back(i);
mu[i] = -1;
}
for (int j = 0; j < p.size() && i * p[j] <= n; j++)
{
vis[i * p[j]] = true;
if (i % p[j] == 0)
{
mu[i * p[j]] = 0;
break;
}
mu[i * p[j]] = mu[i] * mu[p[j]];
}
}
}
欧拉函数
定义
\varphi(n)=\displaystyle\sum_{i=1}^{n}[\gcd(i,n)=1]
性质
\begin{aligned}
(\varphi*1)(n)=\operatorname{id}(n)=\displaystyle\sum_{d\mid n}\varphi(d)=n
\end{aligned}
线性筛 \varphi
\begin{cases}
i=1&\varphi(i)=1\\
i\in prime&\varphi(i)=i-1\\
prime\mid i&\varphi(i*prime)=\varphi(i)\times prime\\
prime\nmid i&\varphi(i*prime)=\varphi(i)\times \varphi(prime)=\varphi(i)\times (prime-1)\\
\end{cases}
Code
void Euler(int n)
{
phi[1] = 1;
vis[1] = 1;
for (int i = 2; i <= n; i++)
{
if (!vis[i])
{
p.emplace_back(i);
phi[i] = i - 1;
}
for (int j = 0; j < p.size() && i * p[j] <= n; j++)
{
vis[i * p[j]] = true;
if (i % p[j] == 0)
{
phi[i * p[j]] = phi[i] * p[j];
break;
}
phi[i * p[j]] = phi[i] * phi[p[j]];
}
}
}
约数个数
定义
\tau(n)=\displaystyle\sum_{i=1}^{n}[i\mid n]
线性筛 \tau
\begin{aligned}
n=\prod_{i=1}p_i^{k_i}\\
\tau(n)=\prod_{i=1}(k_i+1)
\end{aligned}
设 \tau 为 f ,需要辅助数组为 g 。
记 g(n) 为 n 最小质因子的次幂。
\begin{cases}
i\in prime&g(i)=1\\
prime\mid i&g(i*prime)=g(i)+1\\
prime\nmid i&g(i*prime)=1\\
\end{cases}
\begin{cases}
i=1&f(i)=1\\
i\in prime&f(i)=2\\
prime\mid i&f(i*prime)=\frac{f(i)*(g(i*prime)+1)}{g(i)+1}\\
prime\nmid i&f(i*prime)=f(i)*f(prime)=2*f(i)\\
\end{cases}
Code
void Euler(int n)
{
f[1] = 1;
g[1] = 1;
vis[1] = 1;
for (int i = 2; i <= n; i++)
{
if (!vis[i])
{
p.emplace_back(i);
g[i] = 1;
f[i] = 2;
}
for (int j = 0; j < p.size() && i * p[j] <= n; j++)
{
vis[i * p[j]] = true;
if (i % p[j] == 0)
{
g[i * p[j]] = g[i] + 1;
f[i * p[j]] = f[i] / (g[i] + 1) * (g[i * p[j]] + 1);
break;
}
g[i * p[j]] = 1;
f[i * p[j]] = f[i] * f[p[j]];
}
}
}
约数和
定义
\sigma=\displaystyle\sum_{i\mid n}^{n}i
线性筛 \sigma
\begin{aligned}
n=\prod_{i=1}p_i^{k_i}\\
\sigma(n)=\prod_{i=1}\displaystyle\sum_{j=0}^{k_i}p_i^j
\end{aligned}
设 \sigma 为 f ,需要辅助数组为 g 。
记 g(n) 为 \displaystyle\sum_{i=0}p^i ,p 为 n 的最小质因子。
\begin{cases}
i\in prime&g(i)=i+1\\
prime\mid i&g(i*prime)=g(i)*prime+1\\
prime\nmid i&g(i*prime)=prime+1\\
\end{cases}
\begin{cases}
i=1&f(i)=1\\
i\in prime&f(i)=i+1\\
prime\mid i&f(i*prime)=\frac{f(i)*g(i*prime)}{g(i)}\\
prime\nmid i&f(i*prime)=f(i)*f(prime)=(prime+1)*f(i)\\
\end{cases}
Code
void Euler(int n)
{
g[1] = 1;
f[1] = 1;
vis[1] = true;
for (int i = 2; i <= n; i++)
{
if (!vis[i])
{
p.emplace_back(i);
g[i] = i + 1;
f[i] = i + 1;
}
for (int j = 0; j < p.size() && i * p[j] <= n; j++)
{
vis[i * p[j]] = true;
if (i % p[j] == 0)
{
g[i * p[j]] = g[i] * p[j] + 1;
f[i * p[j]] = f[i] / g[i] * g[i * p[j]];
mu[i * p[j]] = 0;
break;
}
g[i * p[j]] = p[j] + 1;
f[i * p[j]] = f[i] * f[p[j]];
}
}
}
恒等函数
定义
\begin{aligned}
\operatorname{id}(n)&=n\\
\operatorname{id_k}(n)&=n^k
\end{aligned}
线性筛 \operatorname{id_k}
\begin{cases}
i=1&\operatorname{id_k}(i)=1\\
i\in prime&\operatorname{id_k}(i)=i^k\\
prime\mid i&\operatorname{id_k}(i*prime)=\operatorname{id_k}(i)*\operatorname{id_k}(prime)\\
prime\nmid i&\operatorname{id_k}(i*prime)=\operatorname{id_k}(i)*\operatorname{id_k}(prime)\\
\end{cases}
Code
void Euler(int n)
{
idk[1] = 1;
vis[1] = 1;
for (int i = 2; i <= n; i++)
{
if (!vis[i])
{
p.emplace_back(i);
idk[i] = pow(i, k);
}
for (int j = 0; j < p.size() && i * p[j] <= n; j++)
{
vis[i * p[j]] = true;
idk[i * p[j]] = idk[i] * idk[p[j]];
if (i % p[j] == 0)
break;
}
}
}
数论分块
引入
数论分块是数论中经常用到的优化方式,可以将复杂度由 O(n) 优化至 O(\sqrt{n}) 。对于 \lfloor\frac{n}{i}\rfloor,i\in[1,n] ,会发现一段区间的贡献是相等的,可以一并计算。
对于 l\in[1,n] ,当 r=\lfloor\frac{n}{\lfloor\frac{n}{l}\rfloor}\rfloor 时,区间 [l,r] 的贡献是相等的,因此可以用数论分块 。
证明
证明之前,先了解一个结论:
\lfloor\frac{\lfloor\frac{n}{a}\rfloor}{b}\rfloor=\lfloor\frac{n}{ab}\rfloor
\qquad
\forall n,a,b\in Z
要满足 \lfloor\frac{n}{i}\rfloor=\lfloor\frac{n}{j}\rfloor ,假设 i,j 位于的相同贡献的块左右端点分别为 l,r ,对于左端点为 l ,此时 r 便为 \lfloor\frac{n}{\lfloor\frac{n}{l}\rfloor}\rfloor ,i\in[l,r] 时结果相同。
证明:
\begin{aligned}
\because\lfloor\frac{n}{i}\rfloor\leqslant\frac{n}{i}\\
\therefore\lfloor\frac{n}{\frac{n}{i}}\rfloor\leqslant\lfloor\frac{n}{\lfloor\frac{n}{i}\rfloor}\rfloor\\
\because\lfloor\frac{n}{\frac{n}{i}}\rfloor=\lfloor{i}\rfloor=i\\
\therefore{i}\leqslant\lfloor\frac{n}{\lfloor\frac{n}{i}\rfloor}\rfloor\\
\end{aligned}
由此证得右端点 r=\lfloor\frac{n}{\lfloor\frac{n}{i}\rfloor}\rfloor 。
单元数论分块
求解形如这种形式的式子:
\displaystyle\sum_{i=1}^{n}\lfloor\frac{n}{i}\rfloor
for (int l = 1, r; l <= n; l = r + 1)
{
r = n / (n / l);
\\doing something.
ans += (r - l + 1) * (n / l);
}
二元数论分块
求解形如这种形式的式子:
\displaystyle\sum_{i=1}^{n}\lfloor\frac{n}{i}\rfloor\lfloor\frac{m}{i}\rfloor
for (int l = 1, r; l <= n; l = r + 1)
{
r = min(n / (n / l), m / (m / l));
\\doing something.
ans += (r - l + 1) * (n / l) * (m / l);
}
狄利克雷卷积
定义
(f*g)(n)=\displaystyle\sum_{xy=n}f(x)*g(x)
等价于:
(f*g)(n)=\displaystyle\sum_{x\mid n}f(x)*g(\frac{n}{x})
重要结论
\begin{aligned}
1*1&=\tau\\
\mu*1&=\varepsilon\\
\varphi*1&=\operatorname{id}\\
\operatorname{id}*\mu&=\varphi\\
\mu*\tau&=1\\
\end{aligned}
狄利克雷卷积
假设 f(n) 已知,g(n) 未知(下列代码中 g 的初始值为 f )。
狄利克雷前缀和
g(n)=\displaystyle\sum_{d\mid n}f(d)
for(prime:begin->end)
for(i:1->n/prime)
g[i*prime]+=g[i];
狄利克雷后缀和
g(n)=\displaystyle\sum_{n\mid d}f(d)
for(prime:begin->end)
for(i:n/prime->1)
g[i]+=g[i*prime];
逆狄利克雷前缀和
f(n)=\displaystyle\sum_{d\mid n}g(d)
for(prime:end->begin)
for(i:n/prime->1)
g[i*prime]-=g[i];
逆狄利克雷后缀和
f(n)=\displaystyle\sum_{n\mid d}g(d)
for(prime:end->begin)
for(i:1->n/prime)
g[i]-=g[i*prime];
莫比乌斯反演
反演结论
\displaystyle\sum_{d\mid\gcd(i,j)}\mu(d)=[\gcd(i,j)=1]
证明:
\begin{aligned}
(\mu*1)(\gcd(i,j))
&=\displaystyle\sum_{d\mid\gcd(i,j)}\mu(d)\\
&=\varepsilon(\gcd(i,j))\\
&=[\gcd(i,j)=1]
\end{aligned}
欧拉反演
反演结论
\displaystyle\sum_{d\mid\gcd(i,j)}\varphi(d)=\gcd(i,j)
证明:
\begin{aligned}
(\varphi*1)(\gcd(i,j))
&=\displaystyle\sum_{d\mid\gcd(i,j)}\varphi(d)\\
&=\operatorname{id}(\gcd(i,j))\\
&=\gcd(i,j)
\end{aligned}
Problem
序
在一切开始之前,为了方便,以下的所有题目默认 n\lt m 。
Question 0
题目
\displaystyle\sum_{i=1}^{n}\displaystyle\sum_{j=1}^{m}[\gcd(i,j)=1]
前言
一切从这里开始,通过这道题目,学会枚举 \gcd 以及运用 \mu 反演。
了解一个重要的等价关系:
[i\mid\gcd(x,y)]=[{i}\mid{x}\land{i}\mid{y}]
算法
证明
\begin{aligned}
\displaystyle\sum_{i=1}^{n}\displaystyle\sum_{j=1}^{m}[\gcd(i,j)=1]
&=\displaystyle\sum_{i=1}^{n}\displaystyle\sum_{j=1}^{m}\displaystyle\sum_{d\mid\gcd(i,j)}\mu(d)\\
&=\displaystyle\sum_{i=1}^{n}\displaystyle\sum_{j=1}^{m}\displaystyle\sum_{d\mid i\land d\mid j}\mu(d)\\
&=\displaystyle\sum_{d=1}^{n}\mu(d)\displaystyle\sum_{i=1}^{n}[d\mid i]\displaystyle\sum_{j=1}^{m}[d\mid j]\\
&=\displaystyle\sum_{d=1}^{n}\displaystyle\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\displaystyle\sum_{j=1}^{\lfloor\frac{m}{d}\rfloor}\mu(d)\\
&=\displaystyle\sum_{d=1}^{n}\lfloor\frac{n}{d}\rfloor\lfloor\frac{m}{d}\rfloor\mu(d)
\end{aligned}
直接 O(n) 线性筛 \mu 然后求 \mu 的前缀和,然后可以做到单次询问 O(\sqrt{n}) 数论分块求解。顺便提一下:\gcd(n,0)=n 。
Code
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
vector<int> p;
bitset<N> vis;
int mu[N];
int sum[N];
int n, m;
void Euler(int n)
{
mu[1] = 1;
for (int i = 2; i <= n; i++)
{
if (!vis[i])
{
p.emplace_back(i);
mu[i] = -1;
}
for (int j : p)
{
if (i * j > n) break;
vis[i * j] = true;
if (i % j == 0) {mu[i * j] = 0;break;}
mu[i * j] = -mu[i];
}
}
}
void Initial(int n)
{
for (int i = 1; i <= n; i++)
sum[i] = sum[i - 1] + mu[i];
}
signed main()
{
cin >> n >> m;
Euler(max(n, m));
Initial(max(n, m));
int ans = 0;
for (int l = 1, r; l <= min(n, m); l = r + 1)
{
r = min(n / (n / l), m / (m / l));
ans += (sum[r] - sum[l - 1]) * (n / l) * (m / l);
}
cout << ans;
return 0;
}
Question 1
题目
\displaystyle\sum_{i=1}^{n}\displaystyle\sum_{j=1}^{m}[\gcd(i,j)=k]
前言
通过这道题目,对于整除 的限制,学会改变 \sum 的枚举方式,直接枚举倍数 。
算法
证明
\begin{aligned}
\displaystyle\sum_{i=1}^{n}\displaystyle\sum_{j=1}^{m}[\gcd(i,j)=k]
&=\displaystyle\sum_{i=1}^{n}[k\mid i]\displaystyle\sum_{j=1}^{m}[k\mid j][\gcd(\frac{i}{k},\frac{j}{k})=\frac{k}{k}]\\
&=\displaystyle\sum_{i=1}^{\lfloor\frac{n}{k}\rfloor}\displaystyle\sum_{j=1}^{\lfloor\frac{m}{k}\rfloor}[\gcd(i,j)=1]\\
&=\displaystyle\sum_{i=1}^{\lfloor\frac{n}{k}\rfloor}\displaystyle\sum_{j=1}^{\lfloor\frac{m}{k}\rfloor}\displaystyle\sum_{d\mid \gcd(i,j)}\mu(d)\\
&=\displaystyle\sum_{d=1}^{\lfloor\frac{n}{k}\rfloor}\mu(d)\displaystyle\sum_{i=1}^{\lfloor\frac{n}{k}\rfloor}[d\mid i]\displaystyle\sum_{j=1}^{\lfloor\frac{m}{k}\rfloor}[d\mid j]\\
&=\displaystyle\sum_{d=1}^{\lfloor\frac{n}{k}\rfloor}\displaystyle\sum_{i=1}^{\lfloor\frac{n}{kd}\rfloor}\displaystyle\sum_{j=1}^{\lfloor\frac{m}{kd}\rfloor}\mu(d)\\
&=\displaystyle\sum_{d=1}^{\lfloor\frac{n}{k}\rfloor}\lfloor\frac{n}{kd}\rfloor\lfloor\frac{m}{kd}\rfloor\mu(d)\\
\end{aligned}
第二步变换就相当于直接枚举 k 的倍数 ,即 i\gets{ik},j\gets{jk} ,发现最后的式子可以二元数论分块 ,O(n) 线性筛 \mu 后预处理 \mu 的前缀和,每次求解 O(\sqrt{n}) 。
Question 2
题目
\displaystyle\sum_{i=1}^{n}\displaystyle\sum_{j=1}^{m}[\gcd(i,j)\in prime]
前言
通过这道题目,掌握莫比乌斯反演推演式子的重要方法:换元 。
算法
证明
直接继承 \operatorname{Problem 1} 的结论:
\begin{aligned}
\displaystyle\sum_{i=1}^{n}\displaystyle\sum_{j=1}^{m}[\gcd(i,j)\in prime]
&=\displaystyle\sum_{k\in prime}\displaystyle\sum_{i=1}^{n}\displaystyle\sum_{j=1}^{m}[\gcd(i,j)=k]\\
&=\displaystyle\sum_{k\in prime}\displaystyle\sum_{d=1}^{\lfloor\frac{n}{k}\rfloor}\lfloor\frac{n}{kd}\rfloor\lfloor\frac{m}{kd}\rfloor\mu(d)
\end{aligned}
直接枚举质数然后求解时间复杂度还不能接受,\operatorname{TLE} ,还需要继续转化。
\displaystyle\sum_{k\in prime}\displaystyle\sum_{d=1}^{\lfloor\frac{n}{k}\rfloor}\lfloor\frac{n}{kd}\rfloor\lfloor\frac{m}{kd}\rfloor\mu(d)=\displaystyle\sum_{T=1}^{n}\lfloor\frac{n}{T}\rfloor\lfloor\frac{m}{T}\rfloor\displaystyle\sum_{k\mid T\land k\in prime}\mu(\frac{T}{k})
解释这一步换元的转化方式:既然要把 T=kd 提出来作为枚举项,则当 k\mid T 时,d=\frac{T}{k} 。所以就化为了这个式子。
这个式子可以直接预处理出 \displaystyle\sum_{k\mid T\land k\in prime}\mu(\frac{T}{k}) ,只需要枚举每个质数 k 的倍数就行了,然后就可以二元数论分块 ,因为只有质数的倍数,预处理时间复杂度不会超过 O(n\ln{n}) ,单次求解时间复杂度 O(\sqrt{n}) 。
Question 3
题目
\displaystyle\sum_{i=1}^{n}\displaystyle\sum_{j=1}^{m}\gcd(i,j)
前言
通过这道题,了解新的反演方式:\varphi 反演。
算法
证明
\begin{aligned}
\displaystyle\sum_{i=1}^{n}\displaystyle\sum_{j=1}^{m}\gcd(i,j)
&=\displaystyle\sum_{i=1}^{n}\displaystyle\sum_{j=1}^{m}\displaystyle\sum_{d\mid \gcd(i,j)}\varphi(d)\\
&=\displaystyle\sum_{d=1}^{n}\varphi(d)\displaystyle\sum_{i=1}^{n}[d\mid i]\displaystyle\sum_{j=1}^{m}[d\mid j]\\
&=\displaystyle\sum_{d=1}^{n}\displaystyle\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\displaystyle\sum_{j=1}^{\lfloor\frac{m}{d}\rfloor}\varphi(d)\\
&=\displaystyle\sum_{d=1}^{n}\lfloor\frac{n}{d}\rfloor\lfloor\frac{m}{d}\rfloor\varphi(d)\\
\end{aligned}
本题使用 \varphi 反演,发现式子跟 \operatorname{Problem 0} 区别不大,只是将 \mu 改为了 \varphi ,二元数论分块 和预处理 \varphi 的前缀和 即可 O(n) 预处理,单次查询 O(\sqrt{n}) 。
Question 4
题目
\displaystyle\sum_{i=a}^{b}\displaystyle\sum_{j=c}^{d}[\gcd(i,j)=k]
前言
学会分解 \sum 。
算法
证明
这道题主要说如何拆这个 \sum ,然后就是 \operatorname{Problem 1} 了,为了方便书写,此篇只说明如何拆 \sum ,证明省去了限制条件。
记 f(n,m)=\displaystyle\sum_{i=1}^{n}\displaystyle\sum_{j=1}^{m}[\gcd(i,j)=k] 。
\begin{aligned}
\displaystyle\sum_{i=a}^{b}\displaystyle\sum_{j=c}^{d}
&=\displaystyle\sum_{i=a}^{b}\displaystyle\sum_{j=1}^{d}-\displaystyle\sum_{i=a}^{b}\displaystyle\sum_{j=1}^{c-1}\\
&=(\displaystyle\sum_{i=1}^{b}\displaystyle\sum_{j=1}^{d}-\displaystyle\sum_{i=1}^{a-1}\displaystyle\sum_{j=1}^{d})-(\displaystyle\sum_{i=1}^{b}\displaystyle\sum_{j=1}^{c-1}-\displaystyle\sum_{i=1}^{a-1}\displaystyle\sum_{j=1}^{c-1})\\
&=f(b,d)-f(a-1,d)-f(b,c-1)+f(a-1,c-1)\\
\end{aligned}
本质是二维容斥:
然后把 f(n,m) 换成 \operatorname{Problem 1} 就解决了。
Question 5
题目
\displaystyle\sum_{i=1}^{n}\displaystyle\sum_{j=1}^{m}\operatorname{lcm(i,j)}
前言
了解 \operatorname{lcm} 的拆解方法:
\operatorname{lcm}(x,y)=\frac{xy}{\gcd(x,y)}
学会使用狄利克雷前缀和 优化时间复杂度。
算法
证明
\begin{aligned}
\displaystyle\sum_{i=1}^{n}\displaystyle\sum_{j=1}^{m}\operatorname{lcm(i,j)}
&=\displaystyle\sum_{i=1}^{n}\displaystyle\sum_{j=1}^{m}\frac{ij}{\gcd(i,j)}\\
&=\displaystyle\sum_{d=1}^{n}\displaystyle\sum_{i=1}^{n}\displaystyle\sum_{j=1}^{m}\frac{ij}{d}[\gcd(i,j)=d]\\
&=\displaystyle\sum_{d=1}^{n}\displaystyle\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\displaystyle\sum_{j=1}^{\lfloor\frac{m}{d}\rfloor}\frac{id\times jd}{d}[\gcd(\frac{id}{d},\frac{jd}{d})=1]\\
&=\displaystyle\sum_{d=1}^{n}d\displaystyle\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\displaystyle\sum_{j=1}^{\lfloor\frac{m}{d}\rfloor}ij[\gcd(i,j)=1]\\
\end{aligned}
设 f(n,m)=\displaystyle\sum_{i=1}^{n}\displaystyle\sum_{j=1}^{m}ij ,发现后半部分可以 O(1) 求:
\begin{aligned}
f(n,m)
&=\displaystyle\sum_{i=1}^{n}\displaystyle\sum_{j=1}^{m}ij\\
&=\displaystyle\sum_{i=1}^{n}i\times\displaystyle\sum_{j=1}^{m}j\\
&=\frac{n\times(n+1)}{2}\times\frac{m\times(m+1)}{2}\\
\end{aligned}
设 g(n,m)=\displaystyle\sum_{i=1}^{n}\displaystyle\sum_{j=1}^{m}ij[\gcd(i,j)=1] ,发现这一部分可以数论分块:
\begin{aligned}
g(n,m)
&=\displaystyle\sum_{i=1}^{n}\displaystyle\sum_{j=1}^{m}ij[\gcd(i,j)=1]\\
&=\displaystyle\sum_{d=1}^{n}\mu(d)\displaystyle\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\displaystyle\sum_{j=1}^{\lfloor\frac{m}{d}\rfloor}id\times jd\\
&=\displaystyle\sum_{d=1}^{n}\mu(d)d^2\times f(\lfloor\frac{n}{d}\rfloor,\lfloor\frac{m}{d}\rfloor)
\end{aligned}
最后换元,发现数论分块套数论分块:
\displaystyle\sum_{d=1}^{n}d\displaystyle\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\displaystyle\sum_{j=1}^{\lfloor\frac{m}{d}\rfloor}ij[\gcd(i,j)=1]=\displaystyle\sum_{d=1}^{n}d\times g(\lfloor\frac{n}{d}\rfloor,\lfloor\frac{m}{d}\rfloor)
【拓展】狄利克雷前缀和优化做法
使用狄利克雷前缀和 。
\begin{aligned}
\displaystyle\sum_{i=1}^{n}\displaystyle\sum_{j=1}^{m}\operatorname{lcm}(i,j)
&=\displaystyle\sum_{d=1}^{n}\displaystyle\sum_{i=1}^{n}\displaystyle\sum_{j=1}^{m}\frac{ij}{d}[\gcd(i,j)=d]\\
&=\displaystyle\sum_{d=1}^{n}d\displaystyle\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\displaystyle\sum_{j=1}^{\lfloor\frac{m}{d}\rfloor}ij[\gcd(i,j)=1]\\
&=\displaystyle\sum_{d=1}^{n}d\displaystyle\sum_{s=1}^{\lfloor\frac{n}{d}\rfloor}s^2\mu(s)\displaystyle\sum_{i=1}^{\lfloor\frac{n}{ds}\rfloor}\displaystyle\sum_{j=1}^{\lfloor\frac{m}{ds}\rfloor}ij\\
&=\displaystyle\sum_{T=1}^{n}T\displaystyle\sum_{d\mid T}d\mu(d)\displaystyle\sum_{i=1}^{\lfloor\frac{n}{T}\rfloor}i\displaystyle\sum_{j=1}^{\lfloor\frac{m}{T}\rfloor}j
\end{aligned}
设:
\begin{aligned}
S(n)&=\displaystyle\sum_{i=1}^{n}i=\frac{n(n+1)}{2}\\
f(n)&=n\mu(n)=\operatorname{id}(n)\mu(n)\\
g(n)&=\displaystyle\sum_{d\mid n}d\mu(d)
\end{aligned}
得到原式等于:
\displaystyle\sum_{T=1}^{n}Tg(T)S(\lfloor\frac{n}{T}\rfloor)S(\lfloor\frac{m}{T}\rfloor)
因为 g(n)=\displaystyle\sum_{d\mid n}d\mu(d)=\displaystyle\sum_{d\mid n}f(d) ,满足狄利克雷前缀和的条件,可以在 O(n\log\log n) 的时间内预处理出来,然后就可以整除分块,总体时间复杂度 O(n\log\log n+\sqrt{n}) 。
狄利克雷前缀和优化代码
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
vector<int> p;
bitset<N> vis;
int mu[N];
int sum[N];
int n, m;
inline void Euler(int n)
{
mu[1] = 1;
for (int i = 2; i <= n; i++)
{
if (!vis[i])
{
mu[i] = -1;
p.emplace_back(i);
}
for (int j : p)
{
if (i * j > n) break;
vis[i * j] = 1;
if (i % j == 0) break;
mu[i * j] = -mu[i];
}
}
}
inline void Initial(int n)
{
for (int i = 1; i <= n; i++)
sum[i] = mu[i] * i;
for (int k : p)
for (int i = 1; i * k <= n; i++)
sum[i * k] += sum[i];
for (int i = 1; i <= n; i++)
sum[i] = sum[i] * i + sum[i - 1];
}
inline int S(int x)
{
return x * (x + 1) / 2;
}
signed main()
{
cin >> n >> m;
Euler(max(n, m));
Initial(max(n, m));
int ans = 0;
for (int l = 1, r; l <= min(n, m); l = r + 1)
{
r = min(n / (n / l), m / (m / l));
ans += (sum[r] - sum[l - 1]) * S(n / l) * S(m / l);
}
cout << ans;
return 0;
}
Question 6
题目
\displaystyle\sum_{i=1}^{n}\displaystyle\sum_{j=1}^{m}\tau(ij)
前言
$$
\tau(ij)=\displaystyle\sum_{x\mid i}\displaystyle\sum_{y\mid j}[\gcd(x,y)=1]
$$
### 算法
- $\mu$ 反演
### 证明
将前置结论代入:
$$
\begin{aligned}
\displaystyle\sum_{i=1}^{n}\displaystyle\sum_{j=1}^{m}\tau(ij)
&=\displaystyle\sum_{i=1}^{n}\displaystyle\sum_{j=1}^{m}\displaystyle\sum_{x\mid i}\displaystyle\sum_{y\mid j}[\gcd(x,y)=1]\\
&=\displaystyle\sum_{i=1}^{n}\displaystyle\sum_{j=1}^{m}\displaystyle\sum_{x\mid i}\displaystyle\sum_{y\mid j}\displaystyle\sum_{d\mid \gcd(x,y)}\mu(d)\\
&=\displaystyle\sum_{d=1}^{n}\mu(d)\displaystyle\sum_{i=1}^{n}\displaystyle\sum_{j=1}^{m}\displaystyle\sum_{x=1}^{i}[x\mid i]\displaystyle\sum_{y=1}^{j}[y\mid j][d\mid\gcd(x,y)]\\
&=\displaystyle\sum_{d=1}^{n}\mu(d)\displaystyle\sum_{x=1}^{n}\displaystyle\sum_{i=1}^{n}[x\mid i]\displaystyle\sum_{y=1}^{m}\displaystyle\sum_{j=1}^{m}[y\mid j][d\mid\gcd(x,y)]\\
&=\displaystyle\sum_{d=1}^{n}\mu(d)\displaystyle\sum_{x=1}^{n}\displaystyle\sum_{y=1}^{m}[d\mid \gcd(x,y)]\lfloor\frac{n}{x}\rfloor\lfloor\frac{m}{y}\rfloor\\
&=\displaystyle\sum_{d=1}^{n}\mu(d)\displaystyle\sum_{x=1}^{n}[d\mid x]\displaystyle\sum_{y=1}^{m}[d\mid y]\lfloor\frac{n}{x}\rfloor\lfloor\frac{m}{y}\rfloor\\
&=\displaystyle\sum_{d=1}^{n}\mu(d)\displaystyle\sum_{x=1}^{\lfloor\frac{n}{d}\rfloor}\displaystyle\sum_{y=1}^{\lfloor\frac{m}{d}\rfloor}\lfloor\frac{n}{xd}\rfloor\lfloor\frac{m}{yd}\rfloor\\
\end{aligned}
$$
设 $f(n)=\displaystyle\sum_{i=1}^{n}\lfloor\frac{n}{i}\rfloor$,换元代入:
$$
\begin{aligned}
\displaystyle\sum_{d=1}^{n}\mu(d)\displaystyle\sum_{x=1}^{\lfloor\frac{n}{d}\rfloor}\displaystyle\sum_{y=1}^{\lfloor\frac{m}{d}\rfloor}\lfloor\frac{n}{xd}\rfloor\lfloor\frac{m}{yd}\rfloor
&=\displaystyle\sum_{d=1}^{n}\mu(d)f(\lfloor\frac{n}{d}\rfloor)f(\lfloor\frac{m}{d}\rfloor)
\end{aligned}
$$
内层 $f$ 数论分块,外层再套一层数论分块就好了。对于 $f$ 函数,如果超时了可以记忆化,因为原题中 $n\leqslant50000$,直接开桶记忆化即可。
## Question 7
### 题目
$$
\displaystyle\sum_{i=1}^{n}\displaystyle\sum_{j=1}^{n}ij\gcd(i,j)
$$
注意数据范围:$n\leqslant 10^{10}$。
### 前言
看到非线性求解的~~逆天~~数据范围,学会运用**亚线性**筛法**杜教筛**。
因为本题以介绍杜教筛的应用为主,所以讲解了两种做法,其中 $\mu$ 反演时间复杂度不正确。
了解基本的公式:
$$
\begin{aligned}
\displaystyle\sum_{i=1}^{n}i&=\frac{n\times(n+1)}{2}\\
\displaystyle\sum_{i=1}^{n}i^2&=\frac{n\times(n+1)\times(2\times n+1)}{6}\\
\displaystyle\sum_{i=1}^{n}i^3&=\frac{n^2\times(n+1)^2}{4}\\
\end{aligned}
$$
### 算法
- $\mu$ 反演
- $\varphi$ 反演
- 杜教筛
### 证明
#### $\mu$ 反演
枚举 $\gcd(i,j)$ 和 $d$ 的倍数,直接将 $\gcd(i,j)$ 替换:
$$
\begin{aligned}
\displaystyle\sum_{i=1}^{n}\displaystyle\sum_{j=1}^{n}ij\gcd(i,j)
&=\displaystyle\sum_{d=1}^{n}d\displaystyle\sum_{i=1}^{n}\displaystyle\sum_{j=1}^{n}ij[\gcd(i,j)=d]\\
&=\displaystyle\sum_{d=1}^{n}d\displaystyle\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\displaystyle\sum_{j=1}^{\lfloor\frac{n}{d}\rfloor}id\times jd[\gcd(i,j)=1]\\
&=\displaystyle\sum_{d=1}^{n}d^3\displaystyle\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\displaystyle\sum_{j=1}^{\lfloor\frac{n}{d}\rfloor}ij[\gcd(i,j)=1]
\end{aligned}
$$
$f,g$ 证明同 $\operatorname{Problem 5}$,此处不再赘述,然后仍然设:
$f(n)=\displaystyle\sum_{i=1}^{n}\displaystyle\sum_{j=1}^{n}ij=(\frac{n\times(n+1)}{2})^2$。
$g(n)=\displaystyle\sum_{i=1}^{n}\displaystyle\sum_{j=1}^{n}ij[\gcd(i,j)=1]=\displaystyle\sum_{d=1}^{n}\mu(d)d^2\displaystyle\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\displaystyle\sum_{j=1}^{\lfloor\frac{n}{d}\rfloor}ij=\displaystyle\sum_{d=1}^{n}\mu(d)d^2\times f(\lfloor\frac{n}{d}\rfloor)$。
最后换元:
$$
\begin{aligned}
\displaystyle\sum_{d=1}^{n}d^3\displaystyle\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\displaystyle\sum_{j=1}^{\lfloor\frac{n}{d}\rfloor}ij[\gcd(i,j)=1]
&=\displaystyle\sum_{d=1}^{n}d^3\times g(\lfloor\frac{n}{d}\rfloor)
\end{aligned}
$$
现在证明另一部分,杜教筛:
对于 $\mu$ 反演的证明,瓶颈在于 $\displaystyle\sum_{d=1}^{n}\mu(d)d^2$,由于 $n$ 很大,无法线性筛,考虑杜教筛:
设:
$$
\begin{aligned}
f(n)&=n^2\mu(n)\\
g(n)&=n^2\\
S(n)&=\displaystyle\sum_{i=1}^{n}f(i)\\
g(1)&=1^2=1\\
\end{aligned}
$$
化简 $(f*g)(n)$:
$$
\begin{aligned}
(f*g)(n)
&=\displaystyle\sum_{d\mid n}f(d)*g(\frac{n}{d})\\
&=\displaystyle\sum_{d\mid n}d^2\mu(d)\times \frac{n^2}{d^2}\\
&=n^2\displaystyle\sum_{d\mid n}\mu(d)\\
&=n^2(\mu*1)(n)\\
&=n^2\varepsilon(n)\\
\end{aligned}
$$
代入通式:
$$
S(n)=\displaystyle\sum_{i=1}^{n}i^2\varepsilon(i)-\displaystyle\sum_{i=2}^{n}i^2\times S(\lfloor\frac{n}{i}\rfloor)=1-\displaystyle\sum_{i=2}^{n}i^2\times S(\lfloor\frac{n}{i}\rfloor)
$$
此时发现 $S(n)$ 可以用杜教筛数论分块求了。
然而很不幸,加上杜教筛,时间复杂度太高,$\mu$ 反演在本题~~遗憾离世~~。
#### $\varphi$ 反演
根据 $\displaystyle\sum_{d\mid \gcd(i,j)}\varphi(d)=\gcd(i,j)$ 直接替换:
$$
\begin{aligned}
\displaystyle\sum_{i=1}^{n}\displaystyle\sum_{j=1}^{n}ij\gcd(i,j)
&=\displaystyle\sum_{i=1}^{n}\displaystyle\sum_{j=1}^{n}\displaystyle\sum_{d\mid \gcd(i,j)}ij\times\varphi(d)\\
&=\displaystyle\sum_{d=1}^{n}\displaystyle\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\displaystyle\sum_{j=1}^{\lfloor\frac{n}{d}\rfloor}id\times jd\times\varphi(d)\\
&=\displaystyle\sum_{d=1}^{n}d^2\varphi(d)\displaystyle\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\displaystyle\sum_{j=1}^{\lfloor\frac{n}{d}\rfloor}ij\\
&=\displaystyle\sum_{d=1}^{n}d^2\varphi(d)\times f(\lfloor\frac{n}{d}\rfloor)
\end{aligned}
$$
同样,瓶颈在于 $\displaystyle\sum_{d=1}^{n}d^2\varphi(d)$,考虑杜教筛:
设:
$$
\begin{aligned}
f(n)&=n^2\varphi(n)\\
g(n)&=n^2\\
S(n)&=\displaystyle\sum_{i=1}^{n}f(i)\\
g(1)&=1^2=1\\
\end{aligned}
$$
化简 $(f*g)(n)$:
$$
\begin{aligned}
(f*g)(n)
&=\displaystyle\sum_{d\mid n}f(d)*g(\frac{n}{d})\\
&=\displaystyle\sum_{d\mid n}d^2\varphi(d)\times \frac{n^2}{d^2}\\
&=n^2\displaystyle\sum_{d\mid n}\varphi(d)\\
&=n^2(\varphi*1)(n)\\
&=n^2\operatorname{id}(n)\\
&=n^3\\
\end{aligned}
$$
代入杜教筛的结论通式:
$$
S(n)=\displaystyle\sum_{i=1}^{n}i^3-\displaystyle\sum_{i=2}^{n}i^2\times S(\lfloor\frac{n}{i}\rfloor)=\frac{n^2\times(n+1)^2}{4}-\displaystyle\sum_{i=2}^{n}i^2\times S(\lfloor\frac{n}{i}\rfloor)
$$
和 $\mu$ 同理,此时发现 $S(n)$ 可以用杜教筛和数论分块求了。
## Question 8
### 题目
$$
\displaystyle\sum_{i=1}^{n}\displaystyle\sum_{j=1}^{m}\gcd(i,j)^k
$$
### 前言
帮助深入了解**线性筛的性质**,运用积性函数的性质,学会筛**一般形式**的积性函数。
### 算法
- $\mu$ 反演
- 线性筛
### 证明
$$
\begin{aligned}
\displaystyle\sum_{i=1}^{n}\displaystyle\sum_{j=1}^{m}\gcd(i,j)^k
&=\displaystyle\sum_{d=1}^{n}d^k\displaystyle\sum_{i=1}^{n}\displaystyle\sum_{j=1}^{m}[\gcd(i,j)=d]\\
&=\displaystyle\sum_{d=1}^{n}d^k\displaystyle\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\displaystyle\sum_{j=1}^{\lfloor\frac{m}{d}\rfloor}[\gcd(i,j)=1]\\
&=\displaystyle\sum_{d=1}^{n}d^k\displaystyle\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\displaystyle\sum_{j=1}^{\lfloor\frac{m}{d}\rfloor}\displaystyle\sum_{s\mid \gcd(i,j)}\mu(s)\\
&=\displaystyle\sum_{d=1}^{n}d^k\displaystyle\sum_{s=1}^{\lfloor\frac{n}{d}\rfloor}\lfloor\frac{n}{ds}\rfloor\lfloor\frac{m}{ds}\rfloor\mu(s)\\
&=\displaystyle\sum_{d=1}^{n}d^k\displaystyle\sum_{s=1}^{\lfloor\frac{n}{d}\rfloor}\lfloor\frac{n}{T}\rfloor\lfloor\frac{m}{T}\rfloor\mu(s)\\
&=\displaystyle\sum_{T=1}^{n}\lfloor\frac{n}{T}\rfloor\lfloor\frac{m}{T}\rfloor\displaystyle\sum_{d\mid T}d^k\mu(\frac{T}{d})
\end{aligned}
$$
预处理是枚举 $d$ 的倍数,但是时间复杂度 $\displaystyle\sum_{i=1}^{n}\frac{n}{i}=n\ln n,(n\leqslant 5\times 10^6)$,时间复杂度 $O(n\ln n)$ 不能接受。
考虑如何快速处理 $\displaystyle\sum_{d\mid T}d^k\mu(\frac{T}{d})$:
先化为狄利克雷卷积的形式:设 $f(n)=(\operatorname{id_k}*\mu)(n)=\displaystyle\sum_{d\mid n}d^k\mu(\frac{n}{d})$,发现 $f(n)$ 即为所求。
因为 $\operatorname{id_k},\mu$ 为积性函数,所以根据**狄利克雷卷积**和**积性函数**的性质,$f$ 也是积性函数,所以可以考虑线性筛 $f$,又根据**唯一分解定理**,所以得到:
$$
\begin{aligned}
f(n)=\displaystyle\prod_{i=1}f(p_i^{s_i})
\end{aligned}
$$
考虑 $f(p_i^{k_i})$:
$$
\begin{aligned}
f(p_i^{s_i})=\displaystyle\sum_{d\mid p_i^{s_i}}d^k\mu(\frac{p_i^{s_i}}{d})
\end{aligned}
$$
根据 $\mu$ 的性质:
$$
\begin{aligned}
\mu(\frac{p_i^{s_i}}{d})=
\begin{cases}
d=p_i^{s_i}&\implies\mu(1)=1\\
d=p_i^{s_i-1}&\implies\mu(p_i)=-1\\
d=p_i^{[0,s_i-1)}&\implies\mu(p_i^{x})=0,(x\gt1)\\
\end{cases}
\end{aligned}
$$
所以发现:
$$
\begin{aligned}
f(p_i^{s_i})
&=\displaystyle\sum_{d\mid p_i^{s_i}}d^k\mu(\frac{p_i^{s_i}}{d})&\text{(1)}\\
&={p_i^{s_i\times k}}\mu(1)+{p_i^{(s_i-1)\times k}}\mu(p_i)&\text{(2)}\\
&={p_i^{s_i\times k}}-{p_i^{(s_i-1)\times k}}&\text{(3)}\\
&={p_i^{(s_i-1)\times k}}\times(p_i^k-1)&\text{(4)}\\\\
\because f(p_i^{s_i-1})&={p_i^{(s_i-2)\times k}}\times(p_i^k-1)\qquad s_i\gt1\\
\therefore f(p_i^{s_i})&=
\begin{cases}
f(p_i^{s_i-1})\times p_i^k&s_i\gt1\\
p_i^k-1&s_i=1
\end{cases}
\end{aligned}
$$
解释 $\text{(1)}\to{(2)}$:根据上面的 $\mu$ 的性质,在 $\text{(1)}$ 式中**有且仅有**在 $d\in\{p_i^{s_i},p_i^{s_i-1}\}$ 时有**非零值**,将 $d$ 带入即可得到 $\text{(2)}$ 式。
在**线性筛**的过程中,对于 $f(i)$ 和 $f(i\times p)$ 便可以求了:
$$
\begin{aligned}
f(i)&=i^k-1\qquad&i\in prime\\
f(i\times p)&=f(i)\times p^k\qquad&[p\mid i]\\
f(i\times p)&=f(i)\times f(p)\qquad&[p\nmid i]\\
\end{aligned}
$$
最后得到式子:
$$
\displaystyle\sum_{T=1}^{n}\lfloor\frac{n}{T}\rfloor\lfloor\frac{m}{T}\rfloor f(T)
$$
$O(n)$ 线性筛出 $f$ 后,直接数论分块 $O(\sqrt{n})$ 查询即可。
## Question 9
### 题目
$$
\displaystyle\sum_{i=1}^{n}\displaystyle\sum_{j=1}^{m}\tau(i)\tau(j)\tau(\gcd(i,j))
$$
### 前言
这道题目相对之前的题目并不新颖,没有新套路,狄利克雷后缀和优化。
### 算法
- $\mu$ 反演
- 狄利克雷后缀和
### 证明
$$
\begin{aligned}
\displaystyle\sum_{i=1}^{n}\displaystyle\sum_{j=1}^{m}\tau(i)\tau(j)\tau(\gcd(i,j))
&=\displaystyle\sum_{d=1}^{n}\tau(d)\displaystyle\sum_{i=1}^{n}\displaystyle\sum_{j=1}^{m}\tau(i)\tau(j)[\gcd(i,j)=d]\\
&=\displaystyle\sum_{d=1}^{n}\tau(d)\displaystyle\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\displaystyle\sum_{j=1}^{\lfloor\frac{m}{d}\rfloor}\tau(id)\tau(jd)[\gcd(i,j)=1]\\
&=\displaystyle\sum_{d=1}^{n}\tau(d)\displaystyle\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\displaystyle\sum_{j=1}^{\lfloor\frac{m}{d}\rfloor}\tau(id)\tau(jd)\displaystyle\sum_{s\mid \gcd(i,j)}\mu(s)\\
&=\displaystyle\sum_{d=1}^{n}\tau(d)\displaystyle\sum_{s=1}^{\lfloor\frac{n}{d}\rfloor}\mu(s)\displaystyle\sum_{i=1}^{\lfloor\frac{n}{ds}\rfloor}\displaystyle\sum_{j=1}^{\lfloor\frac{m}{ds}\rfloor}\tau(ids)\tau(jds)\\
&=\displaystyle\sum_{d=1}^{n}\tau(d)\displaystyle\sum_{s=1}^{\lfloor\frac{n}{d}\rfloor}\mu(s)\displaystyle\sum_{i=1}^{\lfloor\frac{n}{T}\rfloor}\displaystyle\sum_{j=1}^{\lfloor\frac{m}{T}\rfloor}\tau(iT)\tau(jT)\\
&=\displaystyle\sum_{T=1}^{n}\displaystyle\sum_{d\mid T}\mu(\frac{T}{d})\tau(d)\displaystyle\sum_{i=1}^{\lfloor\frac{n}{T}\rfloor}\displaystyle\sum_{j=1}^{\lfloor\frac{m}{T}\rfloor}\tau(iT)\tau(jT)
\end{aligned}
$$
因为有 $\mu*\tau=1$,所以得到:$\displaystyle\sum_{d\mid T}\mu(\frac{T}{d})\tau(d)=(\mu*\tau)(T)=1(T)=1$。
然后得到这个式子:$\displaystyle\sum_{T=1}^{n}\displaystyle\sum_{i=1}^{\lfloor\frac{n}{T}\rfloor}\tau(iT)\displaystyle\sum_{j=1}^{\lfloor\frac{m}{T}\rfloor}\tau(jT)$。
因为数据弱单组测试且 $n,m\leqslant 2\times 10^6$ 直接线性筛 $\tau$ 预处理前缀和就行了,时间复杂度 $(n\ln n)$,可以通过。
数据加强时也可以用**狄利克雷卷积后缀和**优化,此处不再赘述其证明过程,直接套用式子即可。
### Code
本题的**狄利克雷卷积后缀和**优化参考代码片段,时间复杂度 $O(n\log\log n)$:
```cpp
void Euler(int n);
void initial(int n, int m)
{
memcpy(sumn, f, sizeof(sumn));
memcpy(summ, f, sizeof(summ));
for (int k : p)
{
for (int i = n / k; i >= 0; i--)
sumn[i] += sumn[i * k];
for (int i = m / k; i >= 0; i--)
summ[i] += summ[i * k];
}
}
signed main()
{
cin >> n >> m;
Euler(max(n, m));
initial(n, m);
for (int i = 1; i <= min(n, m); i++)
ans += sumn[i] * summ[i];
cout << ans;
return 0;
}
```
## Question 10
### 题目
$$
\displaystyle\sum_{i=1}^{n}\displaystyle\sum_{j=1}^{m}\displaystyle\sum_{d\mid i\land d\mid j}d[\displaystyle\sum_{d\mid i\land d\mid j}d\leqslant a]
$$
### 前言
学会使用**数据结构**解决部分特殊限制,离线询问解决问题。
### 算法
- $\mu$ 反演
- 树状数组
### 证明
首先:$[d\mid i\land d\mid j]\iff [d\mid \gcd(i,j)]$。
设:$\sigma(n)$ 为 $n$ 的约数个数和。
先忽略 $[\displaystyle\sum_{d\mid i\land d\mid j}d\leqslant a]$ 这个限制。
首先这个证明行不通,因为无法处理限制:
$$
\begin{aligned}
\displaystyle\sum_{i=1}^{n}\displaystyle\sum_{j=1}^{m}\displaystyle\sum_{d\mid i\land d\mid j}d
&=\displaystyle\sum_{d=1}^{n}d\displaystyle\sum_{i=1}^{n}[d\mid i]\displaystyle\sum_{j=1}^{m}[d\mid j]\\
&=\displaystyle\sum_{d=1}^{n}\lfloor\frac{n}{d}\rfloor\lfloor\frac{m}{d}\rfloor{d}
\end{aligned}
$$
换一个思路:
$$
\begin{aligned}
\displaystyle\sum_{i=1}^{n}\displaystyle\sum_{j=1}^{m}\displaystyle\sum_{d\mid i\land d\mid j}d
&=\displaystyle\sum_{i=1}^{n}\displaystyle\sum_{j=1}^{m}\sigma(\gcd(i,j))\\
&=\displaystyle\sum_{d=1}^{n}\sigma(d)\displaystyle\sum_{i=1}^{n}\displaystyle\sum_{j=1}^{m}[\gcd(i,j)=d]\\
&=\displaystyle\sum_{d=1}^{n}\sigma(d)\displaystyle\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\displaystyle\sum_{j=1}^{\lfloor\frac{m}{d}\rfloor}[\gcd(i,j)=1]\\
&=\displaystyle\sum_{d=1}^{n}\sigma(d)\displaystyle\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\displaystyle\sum_{j=1}^{\lfloor\frac{m}{d}\rfloor}\displaystyle\sum_{s\mid\gcd(i,j)}\mu(s)\\
&=\displaystyle\sum_{d=1}^{n}\sigma(d)\displaystyle\sum_{s=1}^{\lfloor\frac{n}{d}\rfloor}\mu(s)\lfloor\frac{n}{ds}\rfloor\lfloor\frac{m}{ds}\rfloor\\
&=\displaystyle\sum_{d=1}^{n}\sigma(d)\displaystyle\sum_{s=1}^{\lfloor\frac{n}{d}\rfloor}\mu(s)\lfloor\frac{n}{T}\rfloor\lfloor\frac{m}{T}\rfloor\\
&=\displaystyle\sum_{T=1}^{n}\lfloor\frac{n}{T}\rfloor\lfloor\frac{m}{T}\rfloor\displaystyle\sum_{d\mid T}\sigma(d)\mu(\frac{T}{d})
\end{aligned}
$$
式子化到这里其实就是要统计满足 $\sigma(d)\leqslant a$ 的贡献($\sigma$ 可以线性筛)。然后解决这个问题。
- 多组询问,$a$ 不相同:
本题多组询问,所以可以先把询问**离线**下来按照 $a$ **从小到大排序**,这样贡献只增不减,动态维护 $\displaystyle\sum_{d\mid T}\sigma(d)\mu(\frac{T}{d})$ 前缀和。
- 动态维护 $\displaystyle\sum_{d\mid T}\sigma(d)\mu(\frac{T}{d})$ 前缀和:
可以用**树状数组**维护。先线性筛出 $\sigma$,然后将 $\sigma$ 排序,因为询问时 $a$ 单调不减,这样每次处理一个询问之前先将 $\sigma(d)\leqslant a$ 的贡献通过暴力枚举 $d$ 的倍数更新前缀和,然后再**数论分块**处理。
最后所有询问修改的总体时间复杂度 $O(n\ln n\log n)$,单次询问查询时间复杂度 $O(\sqrt{n}\log n)$。
## Question 11
### 题目
$$
\displaystyle\prod_{i=1}^{n}\displaystyle\prod_{j=1}^{m}F_{\gcd(i,j)}
$$
$F_n$ 为 $\operatorname{Fibonacci}$ 数列第 $n$ 项。
### 前言
对于 $\prod$,通常使用转化为**指数**的方法进而转化为 $\sum$。
### 算法
- $\mu$ 反演
### 证明
$$
\begin{aligned}
\displaystyle\prod_{i=1}^{n}\prod_{j=1}^{m}F_{\gcd(i,j)}
&=\displaystyle\prod_{d=1}^{n}F_d^{\sum_{i=1}^{n}\sum_{j=1}^{m}[\gcd(i,j)=d]}\\
&=\displaystyle\prod_{d=1}^{n}F_d^{\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{d}\rfloor}[\gcd(i,j)=1]}\\
\end{aligned}
$$
设 $g(n,m)=\displaystyle\sum_{i=1}^{n}\displaystyle\sum_{j=1}^{m}[\gcd(i,j)=1]$,莫比乌斯反演套路式:
$$
g(n,m)=\displaystyle\sum_{d=1}^{n}\mu(d)\lfloor\frac{n}{d}\rfloor\lfloor\frac{m}{d}\rfloor
$$
换元代入:
$$
\displaystyle\prod_{d=1}^{n}F_d^{\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{d}\rfloor}[\gcd(i,j)=1]}=\displaystyle\prod_{d=1}^{n}F_d^{g(\lfloor\frac{n}{d}\rfloor,\lfloor\frac{m}{d}\rfloor)}
$$
线性筛 $\mu$ 求前缀和然后直接暴力快速幂就可以了。
其实还有进一步优化空间,可以把时间复杂度优化到 $O(\sqrt n)$,但是式子推到这里就可以通过了。
## Question 12
### 题目
$$
\displaystyle\sum_{i=1}^{n}\displaystyle\sum_{j=1}^{m}\tau(ij)\varphi(ij)
$$
### 前言
本题式子较(te)长,主要是了解积性函数的等价转化:
$$
\begin{aligned}
\tau(n)&=\displaystyle\sum_{i=1}^{n}[i\mid n]\qquad\text{约数个数的定义}\\
\tau(xy)&=\displaystyle\sum_{i\mid x}^{x}\displaystyle\sum_{j\mid y}^{y}[\gcd(i,j)=1]\\
\varphi(ij)&=\frac{\varphi(i)\varphi(j)\gcd(i,j)}{\varphi(\gcd(i,j))}
\end{aligned}
$$
### 算法
- $\mu$ 反演
- 线性筛
### 证明
$$
\begin{aligned}
\displaystyle\sum_{i=1}^{n}\displaystyle\sum_{j=1}^{m}\tau(ij)\varphi(ij)
&=\displaystyle\sum_{i=1}^{n}\displaystyle\sum_{j=1}^{m}\varphi(ij)\displaystyle\sum_{x\mid i}\displaystyle\sum_{y\mid j}[\gcd(x,y)=1]\\
&=\displaystyle\sum_{i=1}^{n}\displaystyle\sum_{j=1}^{m}\varphi(ij)\displaystyle\sum_{x\mid i}\displaystyle\sum_{y\mid j}\displaystyle\sum_{d\mid \gcd(x,y)}\mu(d)\\
&=\displaystyle\sum_{i=1}^{n}\displaystyle\sum_{j=1}^{m}\varphi(ij)\displaystyle\sum_{x\mid i}\displaystyle\sum_{y\mid j}\displaystyle\sum_{d\mid x\land d\mid y}\mu(d)\\
&=\displaystyle\sum_{i=1}^{n}\displaystyle\sum_{j=1}^{m}\varphi(ij)\displaystyle\sum_{d\mid \gcd(i,j)}\tau(\frac{i}{d})\tau(\frac{j}{d})\mu(d)\\
&=\displaystyle\sum_{d=1}^{n}\displaystyle\sum_{i=1}^{n}[d\mid i]\displaystyle\sum_{j=1}^{m}[d\mid j]\varphi(ij)\tau(\frac{i}{d})\tau(\frac{j}{d})\mu(d)\\
&=\displaystyle\sum_{d=1}^{n}\mu(d)\displaystyle\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\displaystyle\sum_{j=1}^{\lfloor\frac{m}{d}\rfloor}\varphi(ijd^2)\tau(\frac{id}{d})\tau(\frac{jd}{d})\\
&=\displaystyle\sum_{d=1}^{n}\mu(d)\displaystyle\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\displaystyle\sum_{j=1}^{\lfloor\frac{m}{d}\rfloor}\frac{\varphi(id)\varphi(jd)\gcd(id,jd)}{\varphi(\gcd(id,jd))}\tau(i)\tau(j)\\
&=\displaystyle\sum_{d=1}^{n}\mu(d)\displaystyle\sum_{s=1}^{n}\displaystyle\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\displaystyle\sum_{j=1}^{\lfloor\frac{m}{d}\rfloor}[\gcd(i,j)=s]\frac{\varphi(id)\varphi(jd)ds}{\varphi(ds)}\tau(i)\tau(j)\\
&=\displaystyle\sum_{d=1}^{n}\mu(d)\displaystyle\sum_{s=1}^{\lfloor\frac{n}{d}\rfloor}\displaystyle\sum_{i=1}^{\lfloor\frac{n}{ds}\rfloor}\displaystyle\sum_{j=1}^{\lfloor\frac{m}{ds}\rfloor}[\gcd(i,j)=1]\frac{\varphi(ids)\varphi(jds)ds}{\varphi(ds)}\tau(is)\tau(js)\\
&=\displaystyle\sum_{d=1}^{n}\mu(d)\displaystyle\sum_{s=1}^{\lfloor\frac{n}{d}\rfloor}\displaystyle\sum_{i=1}^{\lfloor\frac{n}{ds}\rfloor}\displaystyle\sum_{j=1}^{\lfloor\frac{m}{ds}\rfloor}\displaystyle\sum_{t\mid\gcd(i,j)}\mu(t)\frac{\varphi(ids)\varphi(jds)ds}{\varphi(ds)}\tau(is)\tau(js)\\
&=\displaystyle\sum_{d=1}^{n}\mu(d)\displaystyle\sum_{s=1}^{\lfloor\frac{n}{d}\rfloor}\displaystyle\sum_{t=1}^{\lfloor\frac{n}{ds}\rfloor}\mu(t)\displaystyle\sum_{i=1}^{\lfloor\frac{n}{dst}\rfloor}\displaystyle\sum_{j=1}^{\lfloor\frac{m}{dst}\rfloor}\frac{\varphi(idst)\varphi(jdst)ds}{\varphi(ds)}\tau(ist)\tau(jst)\\
\end{aligned}
$$
整理得到结论:
$$
\displaystyle\sum_{d=1}^{n}\mu(d)\displaystyle\sum_{s=1}^{\lfloor\frac{n}{d}\rfloor}\frac{ds}{\varphi(ds)}\displaystyle\sum_{t=1}^{\lfloor\frac{n}{ds}\rfloor}\mu(t)\displaystyle\sum_{i=1}^{\lfloor\frac{n}{dst}\rfloor}\tau(ist)\varphi(dist)\displaystyle\sum_{j=1}^{\lfloor\frac{m}{dst}\rfloor}\tau(jst)\varphi(djst)
$$
发现后面那一部分 $\displaystyle\sum_{i=1}^{\lfloor\frac{n}{dst}\rfloor}\tau(ist)\varphi(dist)$ 和 $\displaystyle\sum_{j=1}^{\lfloor\frac{m}{dst}\rfloor}\tau(jst)\varphi(djst)$ 可以预处理,时间复杂度 $O(n\log^2n)$;设 $g(n,d,x)=\displaystyle\sum_{i=1}^{\lfloor\frac{n}{dx}\rfloor}\tau(ix)\varphi(dix)$,预处理完后前面那一部分 $\displaystyle\sum_{d=1}^{n}\mu(d)\displaystyle\sum_{s=1}^{\lfloor\frac{n}{d}\rfloor}\frac{ds}{\varphi(ds)}\displaystyle\sum_{t=1}^{\lfloor\frac{n}{ds}\rfloor}\mu(t)g(n,d,st)g(m,d,st)$ 也是 $O(n\log^2n)$。总体时间复杂度 $O(n\log^2n)$。
需要筛 $\mu,\varphi,\tau$ 这 $3$ 个积性函数。
## Question 13
### 题目
$$
\displaystyle\sum_{i=1}^{n}\displaystyle\sum_{j=1}^{n}\gcd(i,j)\alpha(\gcd(i,j))(i+j)^k
$$
$$
\alpha(n)=
\begin{cases}
1&\text{n没有平方因子}\\
0&\text{othses}\\
\end{cases}
$$
### 前言
这道题也没有新套路,是**逆狄利克雷后缀和**的题目,熟悉狄利克雷卷积。
### 算法
- 逆狄利克雷后缀和
- $\mu$ 反演。
### 证明
首先发现 $\alpha(n)=\operatorname{abs}(\mu(n))=\mu^2(n)$。
然后考虑化简式子:
$$
\begin{aligned}
\displaystyle\sum_{i=1}^{n}\displaystyle\sum_{j=1}^{n}\gcd(i,j)\alpha(\gcd(i,j))(i+j)^k
&=\displaystyle\sum_{d=1}^{n}\alpha(d)d\displaystyle\sum_{i=1}^{n}\displaystyle\sum_{j=1}^{n}[\gcd(i,j)=d](i+j)^k\\
&=\displaystyle\sum_{d=1}^{n}\alpha(d)d\displaystyle\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\displaystyle\sum_{j=1}^{\lfloor\frac{n}{d}\rfloor}[\gcd(i,j)=1](i+j)^k\\
&=\displaystyle\sum_{d=1}^{n}\alpha(d)d\displaystyle\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\displaystyle\sum_{j=1}^{\lfloor\frac{n}{d}\rfloor}\displaystyle\sum_{s\mid (\gcd(i,j)}\mu(s)(id+jd)^k\\
&=\displaystyle\sum_{d=1}^{n}\alpha(d)d\displaystyle\sum_{s=1}^{\lfloor\frac{n}{d}\rfloor}\mu(s)\displaystyle\sum_{i=1}^{\lfloor\frac{n}{ds}\rfloor}\displaystyle\sum_{j=1}^{\lfloor\frac{n}{ds}\rfloor}(ids+jds)^k\\
\end{aligned}
$$
套路换元:$T=ds$:
$$
\begin{aligned}
\displaystyle\sum_{d=1}^{n}\alpha(d)d\displaystyle\sum_{s=1}^{\lfloor\frac{n}{d}\rfloor}\mu(s)\displaystyle\sum_{i=1}^{\lfloor\frac{n}{ds}\rfloor}\displaystyle\sum_{j=1}^{\lfloor\frac{n}{ds}\rfloor}(ids+jds)^k
&=\displaystyle\sum_{d=1}^{n}\alpha(d)d\displaystyle\sum_{s=1}^{\lfloor\frac{n}{d}\rfloor}\mu(s)\displaystyle\sum_{i=1}^{\lfloor\frac{n}{T}\rfloor}\displaystyle\sum_{j=1}^{\lfloor\frac{n}{T}\rfloor}(iT+jT)^k\\
&=\displaystyle\sum_{T=1}^{n}\displaystyle\sum_{d\mid T}^{n}\alpha(d)\mu(\frac{T}{d})dT^k\displaystyle\sum_{i=1}^{\lfloor\frac{n}{T}\rfloor}\displaystyle\sum_{j=1}^{\lfloor\frac{n}{T}\rfloor}(i+j)^k
\end{aligned}
$$
瓶颈有两处,先处理第 $1$ 处:
1. $\displaystyle\sum_{i=1}^{\lfloor\frac{n}{T}\rfloor}\displaystyle\sum_{j=1}^{\lfloor\frac{n}{T}\rfloor}(i+j)^k
设 $S(n)=\displaystyle\sum_{i=1}^{n}\displaystyle\sum_{j=1}^{n}(i+j)^k$。考虑如何 $O(n)$ 递推。
大力展开:
$$
\begin{aligned}
S(n)
&=\displaystyle\sum_{i=1}^{n}\displaystyle\sum_{j=1}^{n}(i+j)^k\\
&=\displaystyle\sum_{i=1}^{n-1}\displaystyle\sum_{j=1}^{n-1}(i+j)^k+\displaystyle\sum_{i=1}^{n}(n+i)^k+\displaystyle\sum_{i=1}^{n-1}(i+n)^k\\
&=S(n-1)+\displaystyle\sum_{i=n+1}^{2n-1}i^k+\displaystyle\sum_{i=n+1}^{2n-1}i^k+(2n)^k\\
&=S(n-1)+2(\displaystyle\sum_{i=1}^{2n-1}\operatorname{id_k(i)}-\displaystyle\sum_{i=1}^{n}\operatorname{id_k(i)})+\operatorname{id_k(2n)}
\end{aligned}
$$
线性筛 $\operatorname{id_k}$ 求前缀和就行了,于是 $O(n)$ 递推出了所有 $S$。
\displaystyle\sum_{T=1}^{n}\displaystyle\sum_{d\mid T}^{n}\alpha(d)\mu(\frac{T}{d})dT^kS(\lfloor\frac{n}{T}\rfloor)
$\displaystyle\sum_{T=1}^{n}\displaystyle\sum_{d\mid T}^{n}\alpha(d)\mu(\frac{T}{d})d$,直接枚举 $d$ 的倍数预处理,时间复杂度 $O(n\ln n),n\leqslant5\times 10^5$,直接祭掉。
考虑使用**逆狄利克雷后缀和**优化,时间复杂度 $O(n\log\log n)$:
逆狄利克雷后缀和,适用于处理,已知积性函数 $f$ 和正整数 $n$,需要求取积性函数 $g$:
$$
g(n)=\displaystyle\sum_{d\mid n}f(d)
$$
对于本题,设 $f(n)=\mu^2(n)d,g(n)=\displaystyle\sum_{d\mid n}\mu^2(d)\mu(\frac{n}{d})d=\displaystyle\sum_{d\mid n}f(n)*\mu(\frac{n}{d})
两边同时卷 1 ,得到:
\begin{aligned}
(g*1)(n)
&=(f*(u*1))(n)\\
&=\displaystyle\sum_{d\mid n}g(d)=(f*\varepsilon)(n)\\
&=\displaystyle\sum_{d\mid n}g(d)=f(n)\\
\end{aligned}
然后就可以逆狄利克雷后缀和 优化求取,最后 g(n)\times \operatorname{id_k}(n) 就是前面那一部分,然后求 g(n)\times \operatorname{id_k}(n) 的前缀和后数论分块。
Question 14
题目
\displaystyle\sum_{i=1}^{n}\displaystyle\sum_{i=1}^{m}\varphi(ij)
多组 询问 1\leqslant T\leqslant 10^4,1\leqslant n\leqslant 10^5 。
前言
本题将带来新的套路(当然对于莫比乌斯反演来说较阴间):根号分治 。这一部分可能比较困难。
突然让我想起来上面的那道题:
\displaystyle\sum_{i=1}^{n}\displaystyle\sum_{j=1}^{m}\tau(ij)\varphi(ij)
单组 询问 1\leqslant n\leqslant 5\times 10^5 。
然而下面这道题直接少一个函数,这题怕不是弱化版吧。
还记得那道题的式子这么长:
\displaystyle\sum_{d=1}^{n}\mu(d)\displaystyle\sum_{s=1}^{\lfloor\frac{n}{d}\rfloor}\frac{ds}{\varphi(ds)}\displaystyle\sum_{t=1}^{\lfloor\frac{n}{ds}\rfloor}\mu(t)\displaystyle\sum_{i=1}^{\lfloor\frac{n}{dst}\rfloor}\tau(ist)\varphi(dist)\displaystyle\sum_{j=1}^{\lfloor\frac{m}{dst}\rfloor}\tau(jst)\varphi(djst)
然而这道题的式子这么短,花费了不到 10 分钟就推出来了(这莫非就是黑题?):
\displaystyle\sum_{d=1}^{n}\frac{d}{\varphi(d)}\displaystyle\sum_{s=1}^{\lfloor\frac{n}{d}\rfloor}\mu(s)\displaystyle\sum_{i=1}^{\lfloor\frac{n}{ds}\rfloor}\varphi(ids)\displaystyle\sum_{j=1}^{\lfloor\frac{m}{ds}\rfloor}\varphi(jds)
\displaystyle\sum_{T=1}^{n}\displaystyle\sum_{d\mid T}\frac{d}{\varphi(d)}\mu(\frac{T}{d})\displaystyle\sum_{i=1}^{\lfloor\frac{n}{T}\rfloor}\varphi(iT)\displaystyle\sum_{j=1}^{\lfloor\frac{m}{T}\rfloor}\varphi(jT)
后来发现这两个式子都没办法处理多组询问。
算法
证明
按照套路:
\begin{aligned}
\displaystyle\sum_{i=1}^{n}\displaystyle\sum_{j=1}^{m}\varphi(ij)
&=\displaystyle\sum_{i=1}^{n}\displaystyle\sum_{j=1}^{m}\frac{\varphi(i)\varphi(j)\gcd(i,j)}{\varphi(\gcd(i,j))}\\
&=\displaystyle\sum_{d=1}^{n}\displaystyle\sum_{i=1}^{n}\displaystyle\sum_{j=1}^{m}[\gcd(i,j)=d]\frac{\varphi(i)\varphi(j)d}{\varphi(d)}\\
&=\displaystyle\sum_{d=1}^{n}\displaystyle\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\displaystyle\sum_{j=1}^{\lfloor\frac{m}{d}\rfloor}[\gcd(i,j)=1]\frac{\varphi(id)\varphi(jd)d}{\varphi(d)}\\
&=\displaystyle\sum_{d=1}^{n}\displaystyle\sum_{s=1}^{\lfloor\frac{n}{d}\rfloor}\mu(s)\displaystyle\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}[s\mid i]\displaystyle\sum_{j=1}^{\lfloor\frac{m}{d}\rfloor}[s\mid j]\frac{\varphi(id)\varphi(jd)d}{\varphi(d)}\\
&=\displaystyle\sum_{d=1}^{n}\displaystyle\sum_{s=1}^{\lfloor\frac{n}{d}\rfloor}\mu(s)\displaystyle\sum_{i=1}^{\lfloor\frac{n}{ds}\rfloor}\displaystyle\sum_{j=1}^{\lfloor\frac{m}{ds}\rfloor}\frac{\varphi(ids)\varphi(jds)d}{\varphi(d)}\\
&=\displaystyle\sum_{T=1}^{n}\displaystyle\sum_{d\mid T}\frac{d}{\varphi(d)}\mu(\frac{T}{d})\displaystyle\sum_{i=1}^{\lfloor\frac{n}{T}\rfloor}\varphi(iT)\displaystyle\sum_{j=1}^{\lfloor\frac{m}{T}\rfloor}\varphi(jT)\\
\end{aligned}
设:
\begin{aligned}
f(x)&=\displaystyle\sum_{d\mid x}\frac{d}{\varphi(d)}\mu(\frac{x}{d})\\
g(x,k)&=\displaystyle\sum_{i=1}^{x}\varphi(ik)\\
\end{aligned}
不难发现 f 直接枚举倍数,时间复杂度 O(n\ln n) 。
至于 g 将其拆开,也可以得到递推式:
\begin{aligned}
g(x,k)
&=\displaystyle\sum_{i=1}^{x}\varphi(ik)\\
&=\displaystyle\sum_{i=1}^{x-1}\varphi(ik)+\varphi(xk)\\
&=g(x-1,k)+\varphi(xk)\\
\end{aligned}
此时由于多组查询,单词查询 $O(n)$ 并不能满足要求,考虑进一步优化:
设 $h(x,a,b)$ 为 $\displaystyle\sum_{T=1}^{x}\displaystyle\sum_{d\mid T}\frac{d}{\varphi(d)}\mu(\frac{T}{d})\displaystyle\sum_{i=1}^{a}\varphi(iT)\displaystyle\sum_{j=1}^{b}\varphi(jT)$。
换元得到:
$$
h(x,a,b)=\displaystyle\sum_{T=1}^{x}f(T)g(a,T)g(b,T)
$$
照样拆式子得到递推式:
$$
\begin{aligned}
h(x,a,b)
&=\displaystyle\sum_{T=1}^{x}f(T)g(a,T)g(b,T)\\
&=\displaystyle\sum_{T=1}^{x-1}f(T)g(a,T)g(b,T)+f(x)g(a,x)g(b,x)\\
&=h(x-1,a,b)+f(x)g(a,x)g(b,x)
\end{aligned}
$$
把这式子全部预处理出来,时间和空间复杂度 $O(n^2\ln n)$,根本不可能全部预处理,但是发现对于较大的数,它的倒数反而很小,根据这个性质考虑**根号分治**:
因为对于 $T$ 越大的数,对应的 $\lfloor\frac{n}{T}\rfloor,\lfloor\frac{m}{T}\rfloor$ 越小,所以我们可以对于小的一部分直接用 $f,g$ 暴力求,假设这个边界为 $S$:
$$
\begin{aligned}
\displaystyle\sum_{T=1}^{\lfloor\frac{m}{S}\rfloor}\displaystyle\sum_{d\mid T}\frac{d}{\varphi(d)}\mu(\frac{T}{d})\displaystyle\sum_{i=1}^{\lfloor\frac{n}{T}\rfloor}\varphi(iT)\displaystyle\sum_{j=1}^{\lfloor\frac{m}{T}\rfloor}\varphi(jT)
&=\displaystyle\sum_{T=1}^{\lfloor\frac{m}{S}\rfloor}f(T)g(\lfloor\frac{n}{T}\rfloor,T)g(\lfloor\frac{m}{T}\rfloor,T)
\end{aligned}
$$
较大的一部分先预处理 $h$,然后数论分块:
$$
\begin{aligned}
\displaystyle\sum_{l=\lfloor\frac{m}{S}\rfloor+1}^{n}h(r,\lfloor\frac{n}{l}\rfloor,\lfloor\frac{m}{l}\rfloor)-h(l-1,\lfloor\frac{n}{l}\rfloor,\lfloor\frac{m}{l}\rfloor)
\end{aligned}
$$
时间复杂度,$S$ 取 $46$ 最优:
$$
n\ln n+nS\ln S+T(\sqrt n+\frac{n}{S})
$$
## Question 15
### 题目
$$
\displaystyle\prod_{i=1}^{n}\displaystyle\prod_{j=1}^{n}\frac{\operatorname{lcm}(i,j)}{\gcd(i,j)}
$$
时间限制:$200\operatorname{ms}
空间限制:7\operatorname{MB}
模数:104857601
前言
本题用到了 \prod 转化为指数的方法。
这也是比较有意思的题目。主要就是那个时空限制,考虑枚举 \gcd :
\begin{aligned}
\displaystyle\prod_{i=1}^{n}\displaystyle\prod_{j=1}^{n}\frac{\operatorname{lcm}(i,j)}{\gcd(i,j)}
&=\displaystyle\prod_{i=1}^{n}\displaystyle\prod_{j=1}^{n}\frac{i\times j}{\gcd(i,j)^2}\\
&=\displaystyle\prod_{i=1}^{n}\displaystyle\prod_{j=1}^{n}ij\displaystyle\prod_{d=1}^{n}\displaystyle\prod_{i=1}^{n}\displaystyle\prod_{j=1}^{n}d^{-2[\gcd(i,j)=d]}\\
\end{aligned}
遇到这个式子,直接对着指数莫反。
然后就:
没什么,就是全黑了而已。
不要紧,只需要:
卡卡空间就可以 Accepted 了。当然,证明少不了。
算法
证明
\begin{aligned}
\displaystyle\prod_{i=1}^{n}\displaystyle\prod_{j=1}^{n}\frac{\operatorname{lcm}(i,j)}{\gcd(i,j)}
&=\displaystyle\prod_{i=1}^{n}\displaystyle\prod_{j=1}^{n}\frac{i\times j}{\gcd(i,j)^2}\\
&=\displaystyle\prod_{i=1}^{n}\displaystyle\prod_{j=1}^{n}ij\displaystyle\prod_{d=1}^{n}\displaystyle\prod_{i=1}^{n}\displaystyle\prod_{j=1}^{n}d^{-2[\gcd(i,j)=d]}\\
&=\displaystyle\prod_{i=1}^{n}i\displaystyle\prod_{j=1}^{n}j\displaystyle\prod_{d=1}^{n}d^{-2\sum_{i=1}^{n}\sum_{j=1}^{n}[\gcd(i,j)=d]}\\
\end{aligned}
指数部分套路反演:
\begin{aligned}
\displaystyle\sum_{i=1}^{n}\displaystyle\sum_{j=1}^{n}[\gcd(i,j)=d]
&=\displaystyle\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\displaystyle\sum_{j=1}^{\lfloor\frac{n}{d}\rfloor}[\gcd(i,j)=1]\\
&=\displaystyle\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\displaystyle\sum_{j=1}^{\lfloor\frac{n}{d}\rfloor}\displaystyle\sum_{s\mid \gcd(i,j)}\mu(s)\\
&=\displaystyle\sum_{s=1}^{\lfloor\frac{n}{d}\rfloor}\mu(s)\lfloor\frac{n}{ds}\rfloor\lfloor\frac{n}{ds}\rfloor
\end{aligned}
数论分块即可,然后就可以求出:\displaystyle\prod_{d=1}^{n}d^{-2\sum_{i=1}^{n}\sum_{j=1}^{n}[\gcd(i,j)=d]} 。
最后考虑前半部分:
\displaystyle\prod_{i=1}^{n}i\displaystyle\prod_{j=1}^{n}j=\displaystyle\prod_{i=1}^{n}i\times n!=(n!)^{2n}
总式子:
\frac{(n!)^{2n}}{(\prod_{d=1}^{n}d^{\sum_{s=1}^{\lfloor\frac{n}{d}\rfloor}\mu(s)\lfloor\frac{n}{ds}\rfloor\lfloor\frac{n}{ds}\rfloor})^2}
会用到的一个结论:(a\times inv(b))\bmod p =(a\bmod p)\times (inv(b)\bmod p) 。
Question 16
题目
\displaystyle\sum_{i=1}^{n}\displaystyle\sum_{j=1}^{m}\varphi(\frac{\operatorname{lcm}(i,j)}{\gcd(i,j)})
模数:23333
数据:1\leqslant n\leqslant5\times10^4,1\leqslant T\leqslant3\times10^4
前言
根号分治 。
注意一点,遇到 \varphi(ij) 别着急,拆成这个 \frac{\varphi(i)\varphi(j)\gcd(i,j)}{\varphi(\gcd(i,j))} 会让你陷入深渊 ,某个 XX 就把这个式子转化成了 O(n^7) 。
一定不要忘了最基本的积性函数 的性质:
[\gcd(i,j)=1]\qquad
f(ij)=f(i)*f(j)
然后开始证明。
算法
证明
\begin{aligned}
\displaystyle\sum_{i=1}^{n}\displaystyle\sum_{j=1}^{m}\varphi(\frac{\operatorname{lcm}(i,j)}{\gcd(i,j)})
&=\displaystyle\sum_{i=1}^{n}\displaystyle\sum_{j=1}^{m}\varphi(\frac{ij}{\gcd(i,j)^2})\\
&=\displaystyle\sum_{d=1}^{n}\displaystyle\sum_{i=1}^{n}\displaystyle\sum_{j=1}^{m}\varphi(\frac{ij}{d^2})[\gcd(i,j)=d]\\
&=\displaystyle\sum_{d=1}^{n}\displaystyle\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\displaystyle\sum_{j=1}^{\lfloor\frac{m}{d}\rfloor}\varphi(ij)[\gcd(i,j)=1]\\
&=\displaystyle\sum_{d=1}^{n}\displaystyle\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\displaystyle\sum_{j=1}^{\lfloor\frac{m}{d}\rfloor}\varphi(i)\varphi(j)[\gcd(i,j)=1]\text{积性函数的性质}\\
&=\displaystyle\sum_{d=1}^{n}\displaystyle\sum_{s=1}^{\lfloor\frac{n}{d}\rfloor}\mu(s)\displaystyle\sum_{i=1}^{\lfloor\frac{n}{ds}\rfloor}\displaystyle\sum_{j=1}^{\lfloor\frac{m}{ds}\rfloor}\varphi(is)\varphi(js)\\
&=\displaystyle\sum_{T=1}^{n}\displaystyle\sum_{d\mid T}\mu(d)\displaystyle\sum_{i=1}^{\lfloor\frac{n}{T}\rfloor}\varphi(id)\displaystyle\sum_{j=1}^{\lfloor\frac{m}{T}\rfloor}\varphi(jd)\text{s,d等价交换}\\
\end{aligned}
设:g(n,m)=\displaystyle\sum_{i=1}^{n}\varphi(im) ,不难得到 g 的递推式:
g(m,n)=\displaystyle\sum_{i=1}^{n-1}\varphi(im)+\varphi(nm)=g(m,n-1)+\varphi(nm)
时间复杂度 O(n\ln n) 。
原式换元为:
\displaystyle\sum_{T=1}^{n}\displaystyle\sum_{d\mid T}\mu(d)g(d,\lfloor\frac{n}{T}\rfloor)g(d,\lfloor\frac{m}{T}\rfloor)
总体时间复杂度 O(n\ln n + T\times n\log n) ,时间复杂度不能接受。
考虑设置一个限制 S ,对于小部分暴力,大部分数论分块。
设: f(n,m,x)=\displaystyle\sum_{d\mid x}\mu(d)g(d,n)g(d,m)
如果能全部预处理出来就离谱了。所以对于 \leqslant S 的部分我们预处理。
f(n,m,x)=\displaystyle\sum_{d\mid x}\mu(d)g(d,n)g(d,m)
枚举 d 的倍数预处理就行了,注意 x 上界是 \lfloor\frac{limit}{\max(n,m)}\rfloor 。
不太严谨的求边界的方法:
1\leqslant\frac{n,m}{l}\leqslant S\iff l\in[\lfloor\frac{m}{S}\rfloor,n]
对于 (\lfloor\frac{m}{S}\rfloor,n] 进行数论分块,对于 [1,\lfloor\frac{m}{S}\rfloor] 直接暴力。
总体时间复杂度 O(n\ln n+(S+T)+S^2\log n+\sqrt{S}\log S) 。
链接
题单
Problem 0:P2158 [SDOI2008] 仪仗队
Problem 1:P3455 [POI2007]ZAP-Queries
Problem 2:P2257 YY的GCD
Problem 3:P2398 GCD SUM
Problem 4:P2522 [HAOI2011]Problem b
Problem 5:P1829 [国家集训队]Crash的数字表格 / JZPTAB
Problem 6:P3327 [SDOI2015]约数个数和
Problem 7:P3768 简单的数学题
Problem 8:P4449 于神之怒加强版
Problem 9:P6810 「MCOI-02」Convex Hull 凸包
Problem 10:P3312 [SDOI2014]数表
Problem 11:P3704 [SDOI2017]数字表格
Problem 12:P8570 [JRKSJ R6] 牵连的世界
Problem 13:P6156 简单题
Problem 14:P4240 毒瘤之神的考验
Problem 15:P5221 Product
Problem 16:P5572 [CmdOI2019]简单的数论题
多倍经验
Problem 1:
Problem 2:
P2568 GCD
SP4491 PGCD - Primes in GCD Table
Problem 3:
P1390 公约数的和
P1447 [NOI2010] 能量采集
UVA11417 GCD
UVA11424 GCD - Extreme (I)
UVA11426 拿行李(极限版) GCD - Extreme (II)
SP3871 GCDEX - GCD Extreme
SP19985 GCDEX2 - GCD Extreme (hard)
Problem 4:
SP26017 GCDMAT - GCD OF MATRIX
Problem 5:
AGC038C LCMs
P3911 最小公倍数之和
Problem 15:
Band(幽灵乐团)
前言
别忘了,仍然默认 n\leqslant m 。
幽灵乐团最后提交 66 次,成功了,先整一道简单题目:
\displaystyle\sum_{i=1}^{n}\gcd(i,n)
Solution
\begin{aligned}
\displaystyle\sum_{i=1}^{n}\gcd(i,n)
&=\displaystyle\sum_{d\mid n}d\displaystyle\sum_{i=1}^{n}[\gcd(i,n)=d]\\
&=\displaystyle\sum_{d\mid n}d\displaystyle\sum_{i=1}^{\frac{n}{d}}[\gcd(i,\frac{n}{d})=1]\\
&=\displaystyle\sum_{d\mid n}d\varphi(\frac{n}{d})
\end{aligned}
由于只有一组询问枚举 n 的约数即可暴力求 \varphi 即可。但是这个题并不是幽灵乐团,也不是幽灵乐团的前置知识。
题目
幽灵乐团由 3 个子问题构成。
Problem 1
\displaystyle\prod_{i=1}^{A}\displaystyle\prod_{j=1}^{B}\displaystyle\prod_{k=1}^{C}\frac{\operatorname{lcm}(i,j)}{\gcd(i,k)}
将 \operatorname{lcm} 展开:
\displaystyle\prod_{i=1}^{A}\displaystyle\prod_{j=1}^{B}\displaystyle\prod_{k=1}^{C}\frac{i\times j}{\gcd(i,j)\gcd(i,k)}
Solution
我们将这个子问题再化为孙子问题:
\begin{aligned}
f_1(n)
&=\displaystyle\prod_{i=1}^{n}i\\
&=n!\\\\
g_1(n,m)
&=\displaystyle\sum_{i=1}^{n}\displaystyle\sum_{j=1}^{m}[\gcd(i,j)=1]\\
&=\displaystyle\sum_{d=1}^{n}\mu(d)\lfloor\frac{n}{d}\rfloor\lfloor\frac{m}{d}\rfloor
\\\\
h_1(n,m)
&=\displaystyle\prod_{i=1}^{n}\displaystyle\prod_{j=1}^{m}\gcd(i,j)\\
&=\displaystyle\prod_{d=1}^{n}d^{\sum_{i=1}^{n}\sum_{j=1}^{m}[\gcd(i,j)=d]}\\
&=\displaystyle\prod_{d=1}^{n}d^{\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{d}\rfloor}[\gcd(i,j)=1]}\\
&=\displaystyle\prod_{d=1}^{n}d^{g_1(\lfloor\frac{n}{d}\rfloor,\lfloor\frac{m}{d}\rfloor)}
\end{aligned}
原问题变为:
\frac{f_1(A)^{BC}\times f_1(B)^{AC}}{h_1(A,B)^C\times h_1(A,C)^B}
线性筛 \mu 及其前缀和。
预处理 f_1 ,即阶乘。
对 g_1,h_1 数论分块。
Problem 2
\displaystyle\prod_{i=1}^{A}\displaystyle\prod_{j=1}^{B}\displaystyle\prod_{k=1}^{C}(\frac{\operatorname{lcm}(i,j)}{\gcd(i,j)})^{i\times j\times k}
Solution
仍然先展开 \operatorname{lcm} :
\begin{aligned}
\displaystyle\prod_{i=1}^{A}\displaystyle\prod_{j=1}^{B}\displaystyle\prod_{k=1}^{C}\frac{i^{i\times j\times k}\times j^{i\times j\times k}}{\gcd(i,j)^{i\times j\times k}\gcd(i,k)^{i\times j\times k}}
\end{aligned}
将子问题继续分开计算:
\begin{aligned}
f_2(n)
&=\displaystyle\prod_{i=1}^{n}i^i\\\\
g_2(n,m)
&=\displaystyle\sum_{i=1}^{n}\displaystyle\sum_{j=1}^{m}[\gcd(i,j)=1]ij\\
&=\displaystyle\sum_{d=1}^{n}d^2\mu(d)\displaystyle\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}i\displaystyle\sum_{j=1}^{\lfloor\frac{m}{d}\rfloor}j\\
&=\displaystyle\sum_{d=1}^{n}d^2\mu(d)\frac{\lfloor\frac{n}{d}\rfloor(\lfloor\frac{n}{d}\rfloor+1)}{2}\frac{\lfloor\frac{m}{d}\rfloor(\lfloor\frac{m}{d}\rfloor+1)}{2}\\\\
h_2(n,m)
&=\displaystyle\prod_{i=1}^{n}\displaystyle\prod_{j=1}^{m}\gcd(i,j)^{ij}\\
&=\displaystyle\prod_{d=1}^{n}d^{\sum_{i=1}^{n}\sum_{j=1}^{m}[\gcd(i,j)=d]ij}\\
&=\displaystyle\prod_{d=1}^{n}d^{d^2\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{d}\rfloor}[\gcd(i,j)=1]ij}\\
&=\displaystyle\prod_{d=1}^{n}(d^{d^2})^{g_2(\lfloor\frac{n}{d}\rfloor,\lfloor\frac{m}{d}\rfloor)}
\end{aligned}
原问题化为:
\frac{f_2(A)^{\frac{B(B+1)}{2}\frac{C(C+1)}{2}}\times f_2(B)^{\frac{A(A+1)}{2}\frac{C(C+1)}{2}}}{h_2(A,B)^{\frac{C(C+1)}{2}}\times h_2(A,C)^{\frac{B(B+1)}{2}}}
预处理 f_2 ,即 f_2(n)=\prod_{i=1}^{n} i^i 。
预处理 \operatorname{id_2}\times \mu 的前缀和,方便对 g_2 数论分块。
预处理 \prod_{i=1}^{n}i^{i^2} 的前缀积,方便对 h_2 数论分块。
Problem 3
\displaystyle\prod_{i=1}^{A}\displaystyle\prod_{j=1}^{B}\displaystyle\prod_{k=1}^{C}(\frac{\operatorname{lcm}(i,j)}{\gcd(i,j)})^{\gcd(i,j,k)}
Solution
仍然化为孙子问题 。
先考虑分子部分,这部分相对简单。只是出现之前没有见过的东西,大力枚举三个数的 \gcd 。注意,不保证 A\lt B\lt C ,而且不要发挥假的人类智慧 交换 A,B,C ,Wrong Answer,所以我这次写 \min 函数了。
\begin{aligned}
\displaystyle\prod_{i=1}^{A}\displaystyle\prod_{j=1}^{B}\displaystyle\prod_{k=1}^{C}i^{\gcd(i,j,k)}
&=\displaystyle\prod_{d=1}^{\min(A,B,C)}\displaystyle\prod_{i=1}^{A}i^{d\sum_{j=1}^{B}\sum_{k=1}^{C}[\gcd(i,j,k)=d]}\\
&=\displaystyle\prod_{d=1}^{\min(A,B,C)}\displaystyle\prod_{i=1}^{\lfloor\frac{A}{d}\rfloor}id^{d\sum_{j=1}^{\lfloor\frac{B}{d}\rfloor}\sum_{k=1}^{\lfloor\frac{C}{d}\rfloor}[\gcd(i,j,k)=1]}\\
&=\displaystyle\prod_{d=1}^{\min(A,B,C)}\displaystyle\prod_{s=1}^{\lfloor\frac{\min(A,B,C)}{d}\rfloor}\displaystyle\prod_{i=1}^{\lfloor\frac{A}{ds}\rfloor}ids^{d\sum_{j=1}^{\lfloor\frac{B}{ds}\rfloor}\sum_{k=1}^{\lfloor\frac{C}{ds}\rfloor}\mu(s)}\\
&=\displaystyle\prod_{T=1}^{\min(A,B,C)}\displaystyle\prod_{d\mid T}\displaystyle\prod_{i=1}^{\lfloor\frac{A}{T}\rfloor}iT^{d\mu(\frac{T}{d})\lfloor\frac{B}{T}\rfloor\lfloor\frac{C}{T}\rfloor}\\
&=\displaystyle\prod_{T=1}^{\min(A,B,C)}T^{\sum_{d\mid T}d\mu(\frac{T}{d})\lfloor\frac{A}{T}\rfloor\lfloor\frac{B}{T}\rfloor\lfloor\frac{C}{T}\rfloor}\displaystyle\prod_{i=1}^{\lfloor\frac{A}{T}\rfloor}i^{\sum_{d\mid T}d\mu(\frac{T}{d})\lfloor\frac{B}{T}\rfloor\lfloor\frac{C}{T}\rfloor}\\
&=\displaystyle\prod_{T=1}^{\min(A,B,C)}T^{\varphi(T)\lfloor\frac{A}{T}\rfloor\lfloor\frac{B}{T}\rfloor\lfloor\frac{C}{T}\rfloor}({\lfloor\frac{A}{T}\rfloor}!)^{\varphi(T)\lfloor\frac{B}{T}\rfloor\lfloor\frac{C}{T}\rfloor}\\
&=f_3(A,B,C)
\end{aligned}
于是就可以数论分块解决了。
然后就看分母(坟墓)吧,这次没有大力枚举三个数的 \gcd ,我采用两个两个枚举:
\begin{aligned}
\displaystyle\prod_{i=1}^{A}\displaystyle\prod_{j=1}^{B}\displaystyle\prod_{k=1}^{C}\gcd(i,j)^{\gcd(i,j,k)}
&=\displaystyle\prod_{d=1}^{\min(A,B)}d^{\sum_{i=1}^{A}\sum_{j=1}^{B}\sum_{k=1}^{C}[\gcd(i,j)=d]\gcd(d,k)}\\
&=\displaystyle\prod_{d=1}^{\min(A,B)}d^{\sum_{k=1}^{C}\gcd(d,k)\sum_{i=1}^{\lfloor\frac{A}{d}\rfloor}\sum_{j=1}^{\lfloor\frac{B}{d}\rfloor}[\gcd(i,j)=1]}\\
&=h_3(A,B,C)
\end{aligned}
发现指数的后半部分是我们第一问所求的 g_1 。
我们单独将指数的另一部分拿出来:\displaystyle\sum_{i=1}^{C}\gcd(n,i) ,和最上面的那道题有点像,但是上界不一样:
\begin{aligned}
\displaystyle\sum_{i=1}^{C}\gcd(n,i)
&=\displaystyle\sum_{d\mid n}d\displaystyle\sum_{i=1}^{\lfloor\frac{C}{d}\rfloor}[\gcd(\frac{n}{d},i)=1]\\
&=\displaystyle\sum_{d\mid n}d\displaystyle\sum_{i=1}^{\lfloor\frac{C}{d}\rfloor}\displaystyle\sum_{s\mid \gcd(\frac{n}{d},i)}\mu(s)\\
&=\displaystyle\sum_{d\mid n}d\displaystyle\sum_{s\mid \frac{n}{d}}\mu(s)\lfloor\frac{C}{ds}\rfloor\\
&=\displaystyle\sum_{T\mid n}\displaystyle\sum_{d\mid T}d\mu(\frac{T}{d})\lfloor\frac{C}{T}\rfloor\\
&=\displaystyle\sum_{T\mid n}\varphi(T)\lfloor\frac{C}{T}\rfloor\\
&=g_3(n,C)
\end{aligned}
这里出现了新套路,我们来证明一下:
\begin{aligned}
T&=ds\\
&\Rightarrow (d\mid n)\land(s\mid\frac{n}{d})\\
&\Rightarrow (d\mid n)\land(ds\mid n)\\
&\Rightarrow (d\mid n)\land(T\mid n)\\
&\because d\mid T\\
&\therefore (T\mid n)\land(d\mid T)
\end{aligned}
原式子变为:
h_3(A,B,C)=\displaystyle\prod_{d=1}^{\min(A,B)}d^{g_3(d,C)g_1(\lfloor\frac{A}{d}\rfloor,\lfloor\frac{B}{d}\rfloor)}
预处理 n 的倍数,然后求 d^{g_3(d,C)} 前缀积数论分块,查询一次 O(n\ln n+n^{0.75}) ,但是时间复杂度太大,瓶颈在于预处理,继续观察这个式子:\displaystyle\sum_{T\mid n}\varphi(T)\lfloor\frac{C}{T}\rfloor 。
设:f(n,C)=\lfloor\frac{C}{n}\rfloor\varphi(n) ,我们当前要求 g(n)=\displaystyle\sum_{i\mid n}\varphi(i)\lfloor\frac{C}{i}\rfloor=\displaystyle\sum_{i\mid n}f(i,C) 。发现是狄利克雷前缀和 的形式。
所以对于每个 C ,我们可以在 O(n\log\log n) 的时间复杂度内处理出所有的 g_3 ,然后正常数论分块。
原问题化为:
\frac{f_3(A,B,C)\times f_3(B,A,C)}{h_3(A,B,C)\times h_3(A,C,B)}
线性筛 \varphi 和预处理 \varphi 的前缀和,方便对分子部分数论分块。
预处理 i^{\varphi(i)} 的前缀积,方便对分子部分数论分块。
每次询问对于 C 预处理 g_3 数组。然后处理 d^{g_3(d,C)} 前缀积,方便对分母部分数论分块。
Summary
只需要预处理:
然后:
子问题 1 :数论分块套数论分块。
子问题 2 :数论分块套数论分块。
子问题 3 :狄利克雷前缀和,数论分块套数论分块。
忽略快速幂的常数和不固定模数取模的影响。
**幽灵乐团**结束了,莫比乌斯反演也结束了。
# 常用套路
## 枚举 $\gcd
两个数的:
\displaystyle\sum_{i=1}^{n}\displaystyle\sum_{j=1}^{m}\gcd(i,j)\Rightarrow\displaystyle\sum_{d=1}^{n}d\displaystyle\sum_{i=1}^{n}\displaystyle\sum_{j=1}^{m}[\gcd(i,j)=d]
多个数的:
\displaystyle\sum_{i=1}^{A}\displaystyle\sum_{j=1}^{B}\displaystyle\sum_{k=1}^{C}\gcd(i,j,k)\Rightarrow\displaystyle\sum_{d=1}^{A}d\displaystyle\sum_{i=1}^{A}\displaystyle\sum_{j=1}^{B}\displaystyle\sum_{k=1}^{C}[\gcd(i,j,k)=d]
这是必备的。
数论分块
对于一个变量集合 \{a\} ,单元和多元都一样,这也是必备的。
l\leqslant\min(\{a_i\}),r=\min(\{a_i/(a_i/l)\}),l=r+1
对于 \prod 转换为指数上的 \sum
这也是必备的。
\displaystyle\prod_{i=1}^{n}\displaystyle\prod_{j=1}^{n}\gcd(i,j)\Rightarrow\displaystyle\prod_{d=1}^{n}d^{\sum_{i=1}^{n}\sum_{j=1}^{n}[\gcd(i,j)=d]}
顺便提一嘴,\prod 的好处就是可以乱分裂:
\displaystyle\prod_{i=1}^{n}\displaystyle\prod_{j=1}^{n}\frac{ij}{\gcd(i,j)}=\displaystyle\prod_{i=1}^{n}\displaystyle\prod_{j=1}^{n}ij\times\displaystyle\prod_{i=1}^{n}\displaystyle\prod_{j=1}^{n}\gcd(i,j)^{-1}
透彻了解积性函数的定义
对于这些式子 \sum_{i=1}^{n}[\gcd(i,n)=1] 就是 \varphi(n) 了,可以直接省掉一个 \sum ,这很重要啊。再比如 \sum_{i=1}^{n}[i\mid n] 就是 \sigma(n) 。灵活化为积性函数,有时会使问题简单不少。
了解一些结论,方便拆式子:
\begin{aligned}
\varphi(ij)&=\frac{\varphi(i)\varphi(j)\gcd(i,j)}{\varphi(\gcd(i,j))}\\
\tau(ij)&=\displaystyle\sum_{x\mid i}\sum_{y\mid j}[\gcd(i,j)=1]\\
\operatorname{lcm}(i,j)&=\frac{ij}{\gcd(i,j)}\\
\displaystyle\sum_{i=1}^{n}i&=\frac{n(n+1)}{2}\\
\displaystyle\sum_{i=1}^{n}i^2&=\frac{n(n+1)(2n+1)}{6}\\
\displaystyle\sum_{i=1}^{n}i^3&=\frac{n^2(n+1)^2}{4}
\end{aligned}
别忘记了积性函数最基本的定义 :f(ij)=f(i)\times f(j)\land\gcd(i,j)=1 。
所以有时候吧,把式子拆为这样,更方便一点:
\varphi(ij)[\gcd(i,j)=1]=\varphi(i)\varphi(j)[\gcd(i,j)=1]
拆为这样,恐怕就无底洞了。
\varphi(ij)[\gcd(i,j)=1]=\frac{\varphi(i)\varphi(j)\gcd(i,j)}{\varphi(\gcd(i,j))}[\gcd(i,j)=1]
换元替换枚举项
也就是常说的 T=ds :
(d\leqslant n)\land(s\leqslant\lfloor\frac{n}{d}\rfloor)\Rightarrow (T\leqslant n)\land(d\mid T)\land(s=\frac{T}{d})
(d\mid n)\land(s\mid\frac{n}{d})\Rightarrow (T\mid n)\land(d\mid T)\land(s=\frac{T}{d})
枚举倍数
用于预处理和化简式子:
枚举 d 的倍数预处理,时间复杂度 O(n\ln n) :
g(n)=\displaystyle\sum_{d\mid n}f(d)
化简式子,记得枚举倍数时变 i\gets i\times d,j\gets j\times d :
\displaystyle\sum_{i=1}^{n}\displaystyle\sum_{j=1}^{n}ij\gcd(i,j)\Rightarrow\displaystyle\sum_{d=1}^{n}d^3\displaystyle\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\displaystyle\sum_{j=1}^{\lfloor\frac{n}{d}\rfloor}ij[\gcd(i,j)=1]
狄利克雷卷积和前缀和
对 \displaystyle\sum_{d\mid n}f(d)g(\frac{n}{d}) 敏感,万一可以直接卷积成积性函数((\mu*\operatorname{id}=\varphi)\qquad etc... )呢?
当然也要学会运用狄利克雷前缀和,时间复杂度非常优秀 O(n\log\log n) ,比如最后这道幽灵乐团,A loser 差点就诞生了。
数据结构优化
对于某些限制 了,像限制 \gcd 的大小的,各种神奇的函数大小的。可以离线询问,按照限制排序,每次查询之前先继承上一次的限制处理到现在询问的限制。一般是动态维护前缀和,用树状数组可以平衡预处理和询问,做到预处理和询问都是 O(\log n) ;而直接暴力的话大概就是预处理 O(n) ,询问 O(1) ,显然不划算。
比如数表那个题:对于约数个数和 \sigma 和的限制 \sigma\leqslant a ,最后化简出这么一个式子:
因为要整除分块,所以对于一个块的区间 [l,r] ,\displaystyle\sum_{T=l}^{r}\displaystyle\sum_{d\mid T}\sigma(d)\mu(\frac{T}{d}) 是前缀和的形式,每次询问前只要维护 \sigma(x)\leqslant a 相应的贡献都加入 x 的倍数里面,然后就可以数论分块了。
筛法
线性筛可以筛很多积性函数,包括一些化简式子时出现的一些奇怪的积性函数的乘积的形式 \mu(n)^2*\varphi(n)*\operatorname{id}(n)... (都可以筛,随便筛)。只要记住:
每个数只会被他的最小质因数筛一次。
对于数据范围大的无法线性筛的,找到合适的积性函数,用杜教筛。
根号分治
这是莫比乌斯反演很阴间 的做法,因为暴力会超时,全部预处理不仅超时还炸空间,需要设置边界 S 。预处理 S 之内的部分,方便数论分块。对于大的部分 [\lfloor\frac{m}{S}\rfloor+1,n] 数论分块,小部分 [1,\lfloor\frac{m}{S}\rfloor] 暴力。
后言
因为文章太卡了,把代码全删了(原稿有代码,链接见下),如需要可以参考篇首文件 std 。愿各位能够通过本篇例题讲解学到很多莫比乌斯反演的套路。
整完幽灵乐团,可能以后不会再写任何莫比乌斯反演的题解了。这不是终点,并不是永远不做相关的题。而是关于这一部分的文章就不需要了,因为文章达到了它的作用:琢磨完了这部分的套路,Oler 的时间有限,那就不需要再多浪费时间继续深究这部分了。莫比乌斯反演题有很多,但是套路基本就这些了。
Wordpress
Luogu莫比乌斯反演文章-原稿
从最开始的琢磨换元换枚举项 琢磨了一下午到现在对于化简式子可以算是随便跳步,en,本蒟蒻还是有长进的。就这样了。愿广大 Oler 们能坚持自己理想,珍惜时间。
Finished:2022-10-07 11:20:54
Update:2023-01-06 17:39:22
END