题目链接:https://ac.nowcoder.com/acm/problem/16563
题意:
题解:这个方程实际上是逆元的定义,由于b没说是质数,故不能用费马小定理求解。ax=1(mod b)可以转化成ax+by=1(mod b)。这边简单的证明一下,ax%b+by%b=1%b => ax%b=1%b = 原式。得到的方程是一个二元方程,我们要求的逆元是x,因此可以用拓展欧几里得求解。
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
void exgcd(ll a,ll b,ll &x,ll &y){ //拓展欧几里得
if(b==0){
x=1,y=0;return;
}
exgcd(b,a%b,x,y);
ll temp=x;x=y;
y=temp-(a/b)*y;
}
ll inv(ll a,ll b){ //求逆元x
ll x,y;
exgcd(a,b,x,y);
return (x+b)%b; //防止x为负数
}
int main()
{
ll a,b;
cin>>a>>b;
cout<<inv(a,b);
return 0;
}