浅涉算法竞赛中的初等数论
1、欧几里得算法
基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd(b,a%b)。
应用:求最大公约数。
证明:设b = qa + r
假设d是a,b的一个公约数,则有
d|a, d|b,而r = a - kb,因此d|r
因此d是(b,a mod b)的公约数
所以(a,b)和(b,a mod b)的公约数是一样的,其最大公约数也必然相等。
2、扩展欧几里得
基本算法:对于不完全为 0 的非负整数 a、b,gcd(a,b)表示 a,b 的最大公约数,必然存在整数对 x、y ,使得
证明:
设 a>b。
1、显然当 ,此时 ;
2、 时
有
根据朴素的欧几里德原理有
则
这样我们就得到了求解 x1,y1 的方法:x1,y1 的值基于 x2,y2.
上面的思想是以递归定义的,因为 gcd 不断的递归求解一定会有个时候 b=0,所以递归可以结束。
应用:
- 求解不定方程;
- 求解模线性方程(线性同余方程);
- 求解模的逆元.
3、欧拉筛
O(n)的算法,记录下每个素因子,向后标记。
int prime[maxn];
int visit[maxn];
void Euler_Prime(){
for (int i = 2;i <= maxn; i++)
{
if (!visit[i]) prime[++prime[0]] = i; //纪录素数,prime[0]用来计数
for (int j = 1; j <=prime[0] && i*prime[j] <= maxn; j++)
{
visit[i*prime[j]] = 1;
if (i % prime[j] == 0) break;
}
}
}
4、乘法逆元
前言:
我们知道在模意义下的加减乘运算都是具有封闭性的,但除法确是例外。
乘法逆元就是一种在模意义下代替除法运算的东西
定义:
如果有ab≡1(modp),则称b是mod p意义下a的乘法逆元。记b = inv(a) 或 b = a−1
(定义了剩余系中的除法)
性质:
一个数有逆元的充分必要条件是gcd(a,n) = 1,此时逆元唯一存在。
求法:
- 扩展欧几里得
ax≡1(mod p)
可以等价的转化为ax+py=1
复杂度O(log n) - 费马小定理
由ap−1≡1(mod p)
得a×ap-2≡1(mod p)
所以当模数是一个质数的时候,可以用费马小定理求解,即inv(i)=ip-2(mod p),复杂度O(log n) - 欧拉定理
适用于模数不是素数 - 递推
![]()
inv[i] = (p - p/i) * inv[p%i] % p;
5、欧拉函数
应用
- 既约真分数(poj 2478)
给出整数n,让你求解分母小于n的所有既约真分数的个数。
分析:首先我们要搞懂什么是既约真分数,简单来说,就是小于1的最简分数。那么我们很容易将其与欧拉函数联系起来,因为对于一个分母为n的既约真分数的个数,实际上就是phi(n),那么这个问题本质上就是求解phi(2)+…+phi(n).
- 精简打表数据.(uva 10820)
输入两个整数x、y(均小于等于n),输出某个函数值f(x,y),一位选手想打表,但是如果全部打出来的话会造成内存超限,需要精简。
分析:通过“f(x,y)计算f(x,y)”这个题设条件,我们就能够将其联想到欧拉函数。最终表中存的二元组(x,y)只要互素,就能够保证表中不存在任何“赘余(即可由表中的另外某组数据计算得来)”数据.
假设x>y,那么我们枚举x=2、3、…、n,二元组的数量应该是phi(2)+…+phi(n),由对称性,最终结果应该乘2,而且不要忘记了(1,1)这个特殊情况。
最终结果应该是2(phi(2)+…+phi(n)) + 1.

浙公网安备 33010602011771号