求逆元的几种方法

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;
//    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值