数论
快速幂求逆元
b * x ≡ 1(mod p)
根据费马定理:b^(p - 1) ≡ 1(mod p)(其中b和p互质)
可以推出 b * b ^ (p - 2) ≡ 1(mod p)
所以 x = b ^ (p - 2)
所以可以用快速幂来实现。
扩展欧几里得算法
ax + by = c,如果c能够整除gcd(a, b),那么此方程有解,否则无解。
#include <iostream>
#include <vector>
using namespace std;
const int N = 1e3 + 10;
int exgcd(int a, int b, int &x, int &y)
{
if(!b)
{
x = 1, y = 0;
return a;
}
int d = exgcd(b, a % b, y, x);
y -= a / b * x;
return d;
}
int main()
{
int n;
cin >> n;
while(n --)
{
int a, b, x, y;
cin >> a >> b;
int d = exgcd(a, b, x, y);
cout << x << ' ' << y << endl;
cout << d << endl;
}
}
应用:给出a, b, p,求解x 使得 a * x ≡ b(mod p)
此式可化简成a * x = b * y + p => a * x - b * y = p => a * x + b * (-y) = p