随笔分类 - Algorithm / 数学问题
摘要:一、算法简析 BSGS算法(Baby Step Giant Step),可以求解高次同余方程。 条件 正整数 \(a,b,p\),且 \(a\) 与 \(p\) 互质,求满足 \(a^x\equiv b~(mod~p)\) 的最小非负整数 \(x\)。 化简 由拓展欧拉定理,得到 \[a^x\equ
阅读全文
摘要:基础概念 欧拉定理 对于正整数 \(a\) 和 \(m\),若满足 \(gcd(a,m)=1\),则 \(a^{\varphi(m)}\equiv1~(mod~m)\)。\(\varphi(m)\) 为 \(m\) 的欧拉函数。 拓展欧拉定理 在 \((mod~m)\) 的前提下, \[a^b\eq
阅读全文
摘要:一、欧拉函数 定义 \([1,n]\) 中与 \(n\) 互质的数的个数,称为欧拉函数,记为 \(\varphi(n)\)。 互质的定义:对于正整数 \(a\) 和 \(b\),若 \(gcd(a,b)=1\),则 \(a\) 和 \(b\) 互质。 性质 若 \(p\) 是质数,则 \(\varp
阅读全文
摘要:一、算法简析 线性筛,又叫欧拉筛,用来筛出 \([2,n]\) 中所有的质数。该算法比埃氏筛的效率更高,为线性 \(O(N)\)。 该算法也是从小到大枚举每个数,若该数没筛掉,则为质数。但是,筛数的规则不同:此时枚举的数是 \(i\),无论是否是质数,枚举已知的质数 \(p_j\), 合数 \(i
阅读全文
摘要:一、拓展欧几里得算法 1.1 算法简析 根据裴蜀定理,对任意 \(a\) 和 \(b\),一定存在 \(x\) 和 \(y\),使 \(ax + by = \text{gcd}(a, b)\)。拓展欧几里得算法不仅能求出 \(a\) 和 \(b\) 的最大公约数,而且能找到一对 \((x, y)\)
阅读全文
摘要:一、题目描述 P8754 [蓝桥杯 2021 省 AB2] 完全平方数 二、问题简析 2.1 唯一分解定理 唯一分解定理:大于1的自然数都可以唯一地写成素数的积。 由该定理,一个大于 \(1\) 的自然数 \(b\) 可以表示为 \(b=a_1^{p_1}*a_2^{p_2}*...*a_n^{p_
阅读全文
摘要:一、题目描述 P8646 [蓝桥杯 2017 省 AB] 包子凑数 二、题目简析 首先,要理解一个定理——裴蜀定理: 若任意整数 \(a\) 和 \(b\),且有 \(m = \text{gcd}(a, b)\),对任意整数 \(x\) 和 \(y\),\(ax+by=c\),则 \(m~|~c\)
阅读全文
摘要:一、题目描述 P8741 [蓝桥杯 2021 省 B] 试题 C :直线 二、算法简析 设两点 \(P_1(x_1, y_1)\) 和 \(P_2(x_2, y_2)\)。 斜率为: \[k = \frac{y_2 - y_1}{x_2 - x_1} \] 斜截式为: \[\begin{split}
阅读全文
摘要:一、预处理组合数 核心: \[C_a^b = C_{a-1}^b + C_{a-1}^{b-1} \]适用范围:\(a\) 较小的情况下,如 \(a \leq 10^3\)。 算法简析:令 \(\text{C[n][k]}=C_n^k\),规定 \(\text{C[0][0] = 1}\),则 \[
阅读全文
摘要:法一:运用位运算简化计算 以 \(3^{22}\) 为例,它的底数为 \(3\),指数为 \(22\)。指数的二进制形式为 10110。通过二进制与十进制的转换,我们可以把 \(22\) 分解为 \(22 = 2^4 * 2^2 * 2^1\)。因此,\(3^{22} = 3^{2^4} * 3^{
阅读全文
摘要:一、模运算的定义 对于 \(\forall~a\in \mathbb{R},~m \in (0, +\infty)\),求 \(a\) 除以 \(m\) 的余数的运算,就是取模运算,记作 \(a~mod~m\)。 规定 \(0 \leq a~mod~m \leq m - 1\)。若 \(a\) 为负
阅读全文
摘要:一、素性判断 素数,又叫质数,是指一个整数,除了1和本身之外,还有其它的因数(注意:1不是素数)。因此,对于一个整数 \(n\),我们只要检测 \([2, n - 1]\) 能否整除 \(n\)。 整除的定义:\(\exist\) \(a, b, k \in \mathbb{Z}\),使得 \(a
阅读全文
摘要:一、问题描述 P1029 [NOIP2001 普及组] 最大公约数和最小公倍数问题 二、问题简析 2.1 最大公约数 求两个正整数的最大公约数gcd (greatest common divisor),最常用的方法是辗转相除法。 // 求a和b的最大公约数 int gcd(int a, int b)
阅读全文