逆元——速成版
我,一个算法小白,做题发现一个不懂的东西叫逆元,查资料发现大佬们什么欧几里得扩展,啥的说了一大堆,我都没看懂,所以我就想搞一个速成教学,提高大家的学习效率。
没错,就是上面那道题
第一步
什么叫逆元?
第二步
求逆元就是求x呗!
不知到大家发现没有,在编程题中的m普遍都是1000000007(1e9+7),刚好就是一个质数,很适合用费马小定理喔QWQ。
直接使用快速幂求得逆元x即可,注意在快速幂的过程中要对m取余,防止溢出。(取余后等式依然成立,x仍然是a的逆元,不懂的可以查查取余运算的性质)
快速幂很多博主写的都很好,我就不赘述了。
展示一下:
#include <iostream>
using namespace std;
const int mod = 1e9 + 7;
long long qkpow(long long a, long long p) { //快速幂
long long res = 1;
while (p) {
if (p & 1) {
res = res * a % mod;
}
a = a * a % mod;
p >>= 1;
}
return res;
}
int main() {
cout << "请输入一个数,求它模1e9+7的逆元" << endl;
long long a, x;
cin >> a;
x = qkpow(a, mod - 2); //x=a^(mod-2)
cout << "逆元是:";
cout << x << endl;
return 0;
}