1.费马小定理:x的逆元等于x的mod - 2次方(要保证x与mod互质)
2.扩展欧几里得:
#include <iostream>
using namespace std;
int exgcd(int a, int b, int &x, int &y) ///“&x”,对x的引用,在函数里面也可更改x值,而不仅仅是更改原先值的副本
{
if(b == 0)
{
x = 1;
y = 0;
return a;
}
int r = exgcd(b, a % b, x, y);
int t = x;
x = y;
y = t - a / b * y;
return r; ///最终,r依旧是a, b的最大公约数
}
int main()
{
int a, b, x, y;
cin >> a >> b;
exgcd(a, b, x, y);
int k, s;
///x, y可能为负数
k = (x % b + b) % b; ///k是a在模b的条件下的逆元
s = (y % a + a) % a; ///s是b在模a的条件下的逆元
cout << k << endl;
cout << s << endl;
return 0;
}
3.递推求逆元
typedef long long ll;
const int maxn = 1e5 + 100;
ll inv[maxn];
void Inv() //逆元打表
{
inv[1] = 1;
for (int i=2; i<=min(m,n); ++i)
{
inv[i] = (ll) (p - p / i)* inv[p%i] % p;//逆元打表递推式
}
// for(int i=1;i<=min(n,m);i++)
// {
a[i]=(ll)i*inv[ phi[i] ]%p;
// }
}