- 前置知识
- 小碎骨
- 引理1
- 引理2
- 数论分块
- 积性函数
- 定义
- 性质
- 举例
- 狄利克雷(Dirichlet)卷积
- 性质
- 与积性函数的关系
- 莫比乌斯函数
- 定义
- 性质
- 证明
- 关于单位元 $\varepsilon$
- 补充结论
- 线性筛求莫比乌斯函数
- 莫比乌斯反演
- 公式
- 证明
- 例题
- [HAOI2011] Problem b
- 写在最后
前置知识
小碎骨
艾佛森括号 \([P] = \begin{cases} 1 &\text{If P is true}\\ 0 &\text{Otherwise} \end{cases}\)
此处 \(P\) 是一个可真可假的命题。
引理1
证明
引理2
\(|V|\)表示集合\(V\)的元素个数
证明
当\(d\le \left\lfloor\sqrt{n}\right\rfloor\),\(\left\lfloor\dfrac{n}{d}\right\rfloor\)最多有\(\left\lfloor\sqrt{n}\right\rfloor\)种取值。
当\(d\ge \left\lfloor\sqrt{n}\right\rfloor\),有\(\left\lfloor\dfrac{n}{d}\right\rfloor \le \left\lfloor\sqrt{n}\right\rfloor\),\(\left\lfloor\dfrac{n}{d}\right\rfloor\)最多有\(\left\lfloor\sqrt{n}\right\rfloor\)种取值。
\(\left\lfloor\dfrac{n}{d}\right\rfloor\)两两不同时取最大值。
数论分块
内容独立了出来,详细内容见 数论分块 - Luckyblock
对于一类含有\(\left\lfloor\dfrac{n}{i}\right\rfloor\)的求和式 (\(n\) 为常数),
由于\(\left\lfloor\dfrac{n}{i}\right\rfloor\)单调不增,故存在多个区间\([l,r]\), 使得\(\left\lfloor\dfrac{n}{i}\right\rfloor = \left\lfloor\dfrac{n}{j}\right\rfloor(i,j\in [l,r])\)。
对于任意一个\(i\), 我们需要找到一个最大的\(j\), 满足上式,而\(j=\left\lfloor{\dfrac{n}{\left\lfloor{\dfrac{n}{i}}\right\rfloor}}\right\rfloor\)
积性函数
定义
若\(\gcd(x,y) = 1\)且 \(f(xy)=f(x)f(y)\), 则\(f(n)\)为积性函数。
性质
若\(f(x), g(x)\)均为积性函数,则以下函数也为积性函数:
举例
- 单位函数 \(\epsilon(n) = [n = 1]\)
- 恒等函数 \(\operatorname{id}_{k}(n) = n^k\operatorname{id_{1}(n)}\),通常简记为\(\operatorname{id}(n)\)
- 常数函数 \(1(n) = 1\)
- 除数函数 \(\sigma_{k}(n) = \sum\limits_{d\mid n} d^k \sigma_0(n)\),通常简记为\(\operatorname{d}(n)\) 或 \(\tau (n)\), \(\sigma_1(n)\)通常简记为 \(\sigma(n)\)。
- 欧拉函数 \(\varphi(n) = \sum\limits_{i=1}^{n} [\gcd(i,n) = 1]\)
- 莫比乌斯函数 \(\mu(n) = \begin{cases}1 &n=1\\0 &n\ \text{含有平方因子}\\(-1)^k &k\text{为}\ n\ \text{的本质不同质因子个数} \end{cases}\)
没看懂上面写的什么玩意?
根本不用深究,有个印象继续往下看就好。
狄利克雷(Dirichlet)卷积
定义两个数论函数 \(f,g\) 的狄利克雷卷积为
性质
满足 交换律 和 结合律。
\(\varepsilon\)为狄利克雷卷积的单位元,有\((f\ast \varepsilon)(n) = f(n)\)
单位元 \(\varepsilon = \mu \ast 1 \iff \varepsilon (n) = \sum\limits_{d\mid n} \mu (d)\)
与积性函数的关系
定义见上文 积性函数-举例
- 单位元 \(\varepsilon = \mu \ast 1 \iff \varepsilon (n) = \sum\limits_{d\mid n} \mu (d)\)
- 约数个数 \(d = 1 \ast 1 \iff d(n) = \sum\limits_{d\mid n} 1\)
- 除数函数 \(\sigma = d \ast 1 \iff \sigma(n) = \sum\limits_{d \mid n} d\)
- 欧拉函数 \(\varphi = \mu \ast ID \iff \varphi (n) = \sum\limits_{d\mid n} d \cdot \mu(\dfrac{n}{d})\)
也是没看懂上面写的什么玩意?
不用深究,有个印象继续往下看就好。
莫比乌斯函数
定义
\(\mu\) 为莫比乌斯函数,定义为
解释
令 \(n = \prod\limits_{i=1}^{k} p_{i}^{c_i}\),其中\(p_i\)为质因子,\(c_i\ge 1\)。
- \(n=1\)时,\(\mu (n) = 1\)。
- \(n\not ={1}\)时 ,
- \(\exist i\in [1,k], c_i > 1\) 时,\(\mu (n) = 0\)。
当某质因子出现次数大于\(1\)时,\(\mu (n) = 0\)。 - \(\forall i\in [1,k], c_i = 1\) 时,\(\mu (n) = (-1)^k\)。
当每个质因子只出现一次时,即\(n = \prod\limits_{i=1}^{k}p_i\),\(\{p_i\}\)中元素唯一。
\(\mu (n) = (-1)^k\),此处\(k\)为质因子的种类数。
- \(\exist i\in [1,k], c_i > 1\) 时,\(\mu (n) = 0\)。
性质
莫比乌斯函数是积性函数,且具有以下性质
证明
设 \(n = \prod\limits_{i=1}^{k}{p_i^{c_i}}, n' = \prod\limits_{i=1}^{k}{p_i}\)。
- 根据莫比乌斯函数定义,则有:\(\sum\limits_{d\mid n}{\mu(d)} = \sum\limits_{d\mid n'}{\mu(d)}\)。
- 若\(n'\)的某因子 \(d\),有\(\mu (d) = (-1)^i\),则它由 \(i\) 个 本质不同的质因子组成。
由于质因子总数为 \(k\),满足上式的因子数为 \(C_{k}^{i}\)。 - 对于原求和式,转为枚举\(\mu(d)\)的值。
则 \(\sum\limits_{d\mid n'}{\mu(d)} = \sum\limits_{i=0}^{k}{C_{k}^{i} \times (-1)^i} = \sum\limits_{i=0}^{k}{C_{k}^{i} \times (-1)^i\times 1^{k-i}}\)
根据二项式定理,上式 \(= (1+(-1))^k\),
易知该式在\(k=0\) 即 \(n=0\) 时为\(1\),否则为 \(0\)。
关于单位元 \(\varepsilon\)
在上文中定义了 \(\varepsilon (n)= (\mu \ast 1)(n)= \sum\limits_{d\mid n}\mu(d) = [n=1]\)。
满足\((f\ast \varepsilon)(n) = f(n)\)。
证明
- 对于\([\dfrac{n}{d} = 1]\),当且仅当 \(\dfrac{n}{d}=1\),即 \(d=n\) 时为 \(1\),否则为\(0\)。
- 则当 \(d=n\) 时,\(f(d)[\dfrac{n}{d}=1] = f(n)\)。
当 \(d\not ={n}\) 时,\(f(d)[\dfrac{n}{d}=1] = 0\)。
综上,\((f\ast \varepsilon)(n) = \sum_{d\mid n} f(d)[\dfrac{n}{d} = 1] = f(n)\)
补充结论
反演结论: \([\gcd(i,j) = 1] \iff \sum\limits_{d\mid \gcd(i,j)} {\mu (d)}\)
证明1
设 \(n = \gcd(i,j)\),则右\(= \sum\limits_{d\mid n} {\mu (d)} = [n = 1] = [\gcd(i,j) = 1]=\) 左。
证明2
暴力展开:\([\gcd(i,j) = 1] = \varepsilon(\gcd(i,j)) = \sum\limits_{d\mid \gcd(i,j)}\mu(d)\)
线性筛求莫比乌斯函数
\(\mu\) 为积性函数,因此可以线性筛莫比乌斯函数。
int cnt, Mobius[MARX], Prime[MARX];
bool vis[MARX];
void GetMobius()
{
Mobius[1] = 1;
for(int i = 2; i <= N; i ++)
{
if(! vis[i]) Mobius[i] = - 1, 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;
Mobius[i * Prime[j]] = - Mobius[i];
}
}
}
莫比乌斯反演
公式
设\(f(n),g(n)\)为两个数论函数。
如果有
那么有
证明
方法一 :运用卷积。
原问题为:已知 \(f = g\ast 1\),证明 \(g = f\ast \mu\)。
易知如下转化:\(f\ast \mu = g\ast 1 \ast \mu \Rightarrow f\ast \mu = g\ast \varepsilon = g\)。
方法二:对原式进行数论变换。
-
用 \(\sum\limits_{d\mid n}g(d)\) 替换\(f(\dfrac{n}{d})\)。
\[\sum_{d\mid n}{\mu(d)\sum_{k\mid \frac{n}{d}}g(k)} \] -
变换求和顺序。
\[\sum_{k\mid n}g(k)\sum_{d\mid \frac{n}{k}}{\mu(d)} \] -
依据 \(\sum\limits_{d\mid n}{\mu(d)} = [n=1]\),仅当 \(\dfrac{n}{k} = 1\) 时,\(\sum\limits_{d\mid \frac{n}{k}}{\mu(d)} = 1\),否则为 \(0\)。
此时\(k=n\),故上式等价于 \(\sum\limits_{k\mid n} {[n=k]\cdot g(k)} = g(n)\)。
例题
[HAOI2011] Problem b
\(n\) 组询问,每次给定 \(a,b,c,d,k\),求 \(\sum\limits_{x=a}^{b}\sum\limits_{y=c}^{d}[\gcd(x,y) = k]\)。
\(1\le n,k,a,b,c,d\le 5e4\),\(a\le b,c\le d\)。
令 \(f(n,m) = \sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}[\gcd(i,j) = k]\)。
根据容斥原理,则原式等价于 \(f(b,d) - f(a-1,d) - f(b,c-1) + f(a-1,c-1)\)。
所以问题转化为 如何快速求 \(f\) 的值。
化简 \(\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}[\gcd(i,j) = k]\)
-
易知原式等价于
\[\sum\limits_{i=1}^{\left\lfloor\frac{n}{k}\right\rfloor}\sum\limits_{j=1}^{\left\lfloor\frac{m}{k}\right\rfloor}[\gcd(i,j) = 1] \] -
由 \(\varepsilon (n)= \sum\limits_{d\mid n}\mu(d) = [n=1]\),上式化为
\[\sum\limits_{i=1}^{\left\lfloor\frac{n}{k}\right\rfloor}\sum\limits_{j=1}^{\left\lfloor\frac{m}{k}\right\rfloor}\sum_{d\mid \gcd(i,j)}{\mu(d)} \] -
变换求和顺序,先枚举\(d\mid \gcd(i,j)\),可得
\[\sum_{d=1}\mu(d)\sum_{i=1}^{\left\lfloor\frac{n}{k}\right\rfloor}[d\mid i]\sum_{j=1}^{\left\lfloor\frac{m}{k}\right\rfloor}[d\mid j] \]对于上式后半的解释:当\(d\mid i\) 且 \(d\mid j\) 时,\(d\mid \gcd(i,j)\)。
-
易知\(1\sim \left\lfloor\dfrac{n}{k}\right\rfloor\) 中 \(d\) 的倍数有 \(\left\lfloor\dfrac{n}{kd}\right\rfloor\) 个,故原式化为
\[\sum_{d=1}\mu(d)\left\lfloor\dfrac{n}{kd}\right\rfloor\left\lfloor\dfrac{m}{kd}\right\rfloor \]
预处理 \(\mu\) 后,显然可以数论分块求解,复杂度\(O(N + T\sqrt{n})\)。
//By:Luckyblock
#include
#include
#include
#define ll long long
const int MARX = 6e4 + 10;
//=============================================================
int N, a, b, c, d, k;
int cnt, Mobius[MARX], Prime[MARX], Sum[MARX];
bool vis[MARX];
//=============================================================
inline int read()
{
int f = 1, w = 0; char ch = getchar();
for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = -1;
for(; isdigit(ch); ch = getchar()) w = (w << 3) + (w << 1) + (ch ^ '0');
return f * w;
}
void GetMobius()
{
Mobius[1] = 1;
int MAX = MARX - 10;
for(int i = 2; i <= MAX; i ++)
{
if(! vis[i]) Mobius[i] = - 1, Prime[++ cnt] = i;
for(int j = 1; j <= cnt && i * Prime[j] <= MAX; j ++)
{
vis[i * Prime[j]] = true;
if(i % Prime[j] == 0) break;
Mobius[i * Prime[j]] = - Mobius[i];
}
}
for(int i = 1; i <= MAX; i ++) Sum[i] = Sum[i - 1] + Mobius[i];
}
ll Calc(int x, int y)
{
ll ans = 0ll; int max = std :: min(x, y);
for(int l = 1, r; l <= max; l = r + 1)
r = std :: min(x / (x / l), y / (y / l)),
ans += (1ll * x / (1ll * l * k)) * (1ll * y / (1ll * l * k)) * (Sum[r] - Sum[l - 1]);
return ans;
}
ll Solve()
{
a = read(), b = read(), c = read(), d = read(), k = read();
return Calc(b, d) - Calc(b, c - 1) - Calc(a - 1, d) + Calc(a - 1, c - 1);
}
//=============================================================
int main()
{
N = read(); GetMobius();
while(N --) printf("%lld\n", Solve());
return 0;
}
写在最后
参考资料
\(\text{Oi-Wiki-莫比乌斯反演}\)
把\(\text{Oi-Wiki}\)上的内容进行了复制 整理扩充。
我是个没有感情的复读机(大雾)