数学 : 从入门到入土
目录
-
一点前置知识
-
数论函数,莫比乌斯反演与卷积
-
生成函数
-
同余与乘法逆元
-
组合数学
-
期望与概率
前置知识
元,单位元和逆元
首先,这三个概念都是对于一个特定的运算而言的.
元就是运算的要素,在加减乘除里就是数,在狄利克雷卷积里就是数论函数,在矩阵乘法里就是矩阵.
单位元满足如下性质:
对于一个运算\(\operatorname{op}(x,y)\),定义单位元\(I\)使得\(\operatorname{op}(x,i) = \operatorname{op}(i,x) = x\).
例如在加法,单位元就是\(0\),乘法单位元为\(1\),矩阵乘法单位元为单位矩阵\(I\),狄利克雷卷积单位元为单位元函数\(\varepsilon(x) = [x=1]\).
快速幂
对于一个幂\(x^p\),存在能在\(\mathrm{O}(\log n)\)时间复杂度去计算它的方式.
考虑\(p\)的奇偶.
即可.
代码实现求\(a \times b \bmod p\) :
ll qpow(ll a,ll b,ll p) {
ll res = 1;
while(b) {
if(b & 1) res = res * a % p;
a = a * a % p;
b >>= 1;
}
return res;
}
常用符号
\(\phi\),空集.
\(\LaTeX\):$\phi$
\(\varphi\),欧拉函数.
\(\LaTeX\):$\varphi$
\([\text{表达式}]\),艾佛森约定,即如果中括号内表达式为真则为1,为伪则为0.
\(\LaTeX\):$[ ]$
\(\mu\),莫比乌斯函数
\(\LaTeX\):$\mu$
\(\lfloor x \rfloor\)下取整.
\(\LaTeX\):$\lfloor \rfloor$
\(\lceil x \rceil\)上取整.
\(\LaTeX\):$\lceil \rceil$
数论函数,莫比乌斯反演与卷积
数论分块/整除分块
用于将带下取整(形如\(\lfloor\frac{n}{k} \rfloor)\)的合式从\(\Theta(n)\)优化到\(\Theta(\sqrt{n})\).
对于一个数\(n\)使得\(\lfloor \frac{n}{k} \rfloor = p\),不难发现对于一个特定的区间使得\(k \in [l,r]\)都有同样的\(p\)与之对应.
比如\(n = 10\),\(p = 2\),使得\(k \in [4,5]\)时,\(\lfloor \frac{n}{k} \rfloor = p\)均成立,于是求出每个块左右端点就可以简化求下取整的过程.
例题
题意简单到离谱:
给出\(n,k\),求
作为求和指标的\(i\)以模数的形式出现实在是十分奇妙.
szq巨神曾言道:式子都是越推越复杂然后解出来的
考虑模的意义:
\(k \bmod i = k - i\lfloor \frac{k}{i} \rfloor\)
式子化为:
其中后一部分可以靠数论分块求得.
具体实现
首先要确定分母\(n\)和左端点\(l\).
这时候我们要找到一个最大的\(r\),使得
\(\lfloor \frac{n}{l} \rfloor = \lfloor \frac{n}{r} \rfloor\)
根据数论分块,有:
即可完成分块.
对于下一块,将上一块的右端点+1作为其左端点,重复此过程即可.
例题代码
int mian() {
ll n = read(),k = read();
ll ans = n * k;
for(ll l = 1,r;l <= n;l = r + 1) {
if(k / l) r = std::min(k / (k / l),n);
else r = n;
ans -= (k / l) * (r - l + 1) * (l + r) / 2;
}
write(ans);
return 0;
}
数论函数
定义域为正整数集\(\mathbb{N^*}\)的函数.
常见的数论函数:
阶乘
\(n! = \prod^{n}_{i = 1} i\)
数列
\(\{a_i\}\)
幂
\(n^\lambda\)
积性函数
一种特殊的数论函数,满足对于整数\(i,j\),当\(\gcd(i,j) = 1\),有:
\(f(ij) = f(i)f(j)\)
显然这条特性对于一个质数\(i\)的函数值被求出后可以拓展到更多函数值.
完全积性函数:
对于所有整数\(i,j\),
\(f(ij) = f(i)f(j)\)
常见的积性函数 :
欧拉函数
\(\varphi(x)\),代表\([1,x]\)里与\(x\)互质的数的个数
显然对于一个质数\(p\),有\(\varphi(p) = p - 1\)
void EulerPrime(int n) {
phi[1] = 1;
ff(i,2,n) {
if(!vis[i]) {
phi[i] = i - 1;
prime[pcnt++] = i;
}
ff(j,0,pcnt - 1) {
if(1ll * i * prime[j] > N)
break;
vis[i * prime[j]] = 1;
if(i % prime[j])
phi[i * prime[j]] = phi[i] * (prime[j] - 1);
else {
phi[i * prime[j]] = phi[i] * prime[j];
break;
}
}
}
}
莫比乌斯函数
\(\mu(x) = \left\{\begin{matrix} &1 (n = 1)\\ &0 (n \text{含有平方因子})\\ &(-1)^k,k\text{为}n\text{的本质不同因子个数} \end{matrix}\right.\)
这个定义十分令人迷惑.
由于唯一分解定理,每个自然数\(n\)都可以表示成:
其中\(p\)为质数.
那么莫比乌斯函数可以表示为:
\(\mu(x) = \left\{\begin{matrix} &1 (n = 1)\\ &0(\exists\ i,c_i \ge 2)\\ &(-1) ^ {\sum c_i} \ \mathrm{otherwise}. \end{matrix}\right.\)
单位元函数
\(\varepsilon(n) = [n = 1]\)
这个函数在狄利克雷卷积中作为单位元存在,即:
对于一个数论函数\(f(x)\),\(f * \varepsilon = f\)
例题
积性函数在OI中的地位体现在可以用线性筛在\(\Theta(n)\)复杂度内求出.
模板中的模板,欧拉筛法.
相比于\(\mathrm{O}(n\log \log n)\)的埃拉托色尼筛法更加的快捷,代码量也不大.
原理是使一个合数总是被自己的最小质因数筛掉,防止像埃氏筛一样出现合数被多次标记的情况.
考虑什么情况下会导致看不见另一个人.
将左下角的点和其他点连线,考虑每一个点对连线的斜率.
对于一个斜率\(\tan \theta = \frac{b}{a}\),有最小的\(\gcd(a,b) = 1\)使得其他斜率相同的连线形成的三角形都是其位似,即被最初这一对\(a,b\)所阻挡.
于是对于坐标\((i,j)\),有\(\gcd(i,j) = 1 \Leftrightarrow (i,j) \footnotesize\text{为可见点}\)
枚举每个横坐标,则这个横坐标对答案贡献为与其互质的纵坐标个数,这是对于下半部分等腰直角三角形的贡献,那么答案为:
线性筛即可.
狄利克雷卷积
函数卷起来了
更多例题
给出\(n\),求:
多倍经验:
UVA11426 拿行李(极限版) GCD - Extreme (II)
有些要忽略重复贡献,稍微减一下即可.
突然发现这好像是欧拉反演,不过这不要紧
众所周知,欧拉函数有一条奇妙的性质:
然后还有\(\gcd\)的奇妙性质,于是我们把\(\gcd\)套进前面的式子.
好像很棒的样子.
现在我们带回原式吧.
就这么结束了.
求欧拉函数\(\mathrm{O}(n)\),然后直接枚举\(d\)即可.
当然可以整除分块,如果使用\(\mathrm{Powerful Number}\)筛求前缀和的话就是\(\mathrm{O}(\sqrt{n})\).
是不是和仪仗队那道题特别像
这道题的特点是行数和列数不相等,于是重新从斜率的角度出发.
首先,点\((i,j)\)对答案没有贡献(即连线上没有植物)的条件是\(\gcd(i,j) = 1\).
考虑如何计算损失.
众所周知,有一种东西叫做位似.
显然点\((i,j)\)到\((0,0)\)的路径上有\(\gcd(i,j) - 1\)个整点.
于是其贡献转化为\(2(\gcd(i,j) - 1) + 1 = 2\gcd(i,j) - 1\)
易得总贡献为:
考虑如何计算二重合式的部分.
现在仍然是把欧拉反演的结论套上去,参考上一题即可:
同样的套路.
用简单的数学基础
巨佬们说的数学"直觉"
小学五年级学生都会的奥数
强大坚实的打表功力
看不出来你AFO吧
就能看出,这个公式是求:
其中\(d(x)\)为因数个数函数(除数函数).
一个简单的想法就是直接线性筛,可以直接得到70分,可喜可贺,可喜可贺.
尝试找到更优的解法,众所周知\(\sqrt{10^{14}} = 10^7\),于是考虑有没有根号级复杂度的算法.
考虑枚举因数,在一个区间\([1,n]\)中,数\(i\)作为因子出现的次数为\(\lfloor \frac{n}{i} \rfloor\),于是转化为前缀和相减的形式即可用数论分块求解了.
即:
生成函数
又名母函数.
普通生成函数 (OGF)
对于一个数列 \(<a_n>\) 定义其普通生成函数为 :
举个例子 : 对于斐波那契数列 :
做其 OGF 为 :
考虑递推式,其中有 \(f_{n - 1}\) 项与 \(f_{n - 2}\) 项,试构造恒等关系,使得其中对于高位部分 \(f_{n - 1}\) 与 \(f_{n- 2}\) 和 \(f_n\)分别对齐.
构造\(xF(x)\),相当于把无限合式向右移动一位,构造 \(x^2F(x)\) , 相当于把无限合式右移 \(2\) 位.
n | 0 | 1 | 2 | 3 | 4 |
---|---|---|---|---|---|
\(F(x)\) | \(f_0 x^0\) | \(f_1 x^1\) | \(f_2 x^2\) | \(f_3 x^3\) | \(f_4x^4\) |
\(xF(x)\) | 无0次项 | \(f_0 x^1\) | \(f_1 x^2\) | \(f_2 x^3\) | \(f_3x^4\) |
\(x^2F(x)\) | 无0次项 | 无1次项 | \(f_0 x^2\) | \(f_1 x^3\) | \(f_2x^4\) |
这时考虑\(F(x) = xF(x) - x^2F(x)\)是否成立,显然对于\(n = 2\)以上均成立,考虑 \(n = 1,0\)两项.
可得新恒等关系:
于是 :
那么如何求出通项 ?
考虑待定系数法 :
于是列出方程组 :
求解即可
可以发现 \(a\)是著名的 黄金分割 ,这时候可以记 \(a\) 为 \(\phi\) 记 \(b\) 为 \(\hat\phi\)
于是 :
根据幂级数展开,得到 :
那么根据之前生成函数的定义,可知系数就是通项,于是 :
比起什么矩阵啊,特征方程啊,简单又好证,非常的套路化,可以套模板.
这就是生成函数的好处.
常用 OGF 与 OGF 变形方式
质数生成函数 (EGF)
狄利克雷生成函数 (DGF)
同余与乘法逆元
组合数学
醒醒,你连数都数不明白