百度注册网站,淮南发布网,广州番禺营销型网站建设,在百度平台如何做营销快速幂原理介绍 快速幂模板
int qmi(int a, int k, int p) {int res 1;while (k) {//后面的a其实是底数与其指数的运算结果了#xff0c;是不断迭代的//第一个a其实就是a的2的0次方if (k 1) res (res * a) % p;a (a * a) % p;//注意#xff0c;a是一个不断变化的过…
快速幂原理介绍 快速幂模板
int qmi(int a, int k, int p) {int res 1;while (k) {//后面的a其实是底数与其指数的运算结果了是不断迭代的//第一个a其实就是a的2的0次方if (k 1) res (res * a) % p;a (a * a) % p;//注意a是一个不断变化的过程//下一个a就等于上一个a的平方k 1;}return res;
} 快速幂求逆元
首先要知道什么是逆元。
在模运算下如果存在一个数 b使得 (a * b) mod p 1a不是p的倍数那么我们称 b 是 a 在模 p 下的逆元。 费马小定理假设我们需要计算 a 在模 p 下的逆元即要找到一个数 b使得 (a * b) mod p 1。根据费马小定理当 a 不是 p 的倍数时有 a^(p-1) mod p 1。将其变形为 a^(p-2) mod p a^(-1) (mod p)即 a 的逆元a^(-1)等于 a^(p-2) 在模 p 下的余数。因此我们只需使用快速幂算法计算 a^(p-2) mod p 即可得到 a 在模 p 下的逆元。 例题 分析
1.先看逆元存不存在不存在就输出impossible。如果a不是p的倍数a%p!0逆元才存在。
2.如果逆元存在用快速幂算 a^(p-2) mod p 即可 int qmi(int a, int k, int p) {int res 1;while (k) {//后面的a其实是底数与其指数的运算结果了是不断迭代的//第一个a其实就是a的2的0次方if (k 1) res (res * a) % p;a (a * a) % p;//注意a是一个不断变化的过程//下一个a就等于上一个a的平方k 1;}return res;
}bool check(int a, int p) {if (a % p 0) return true;return false;
}
signed main() {int t; cin t;while (t--) {int a, p; cin a p;if (check(a, p)) {cout impossible endl;continue;}cout qmi(a, p - 2, p) endl;}retu