快速幂
快速幂 (O (log k ))
- 问题解决:可以快速地求出 a ^ k % p , 1 <= a p k <= 1e9。
- 知识 1 :模的运算
(a + b) % p = (a % p + b % p) % p
(a - b) % p = (a % p - b % p) % p
(a * b) % p = (a % p * b % p) % p
a ∧ b % p = ( (a % p) ∧ b ) % p
正整数 a, b对 p取模,它们的余数相同,记作 (a % p ) =( b % p) 意味 a ≡ b (mod p) - 知识二:位运算 位运算是直接在二进制下运算
名称 符号 规则 与 & 两个位都为1时,结果为1 或 | 两个位都为0时,结果为0 异或 ^ 两个位相同的话为0,不同为1 取反 ~ 把0变1,1变0 - 思路:a ^ k % p ,k 可以 转化为二进制,根据二进制转换为十进制(从右往左) k = x 2 ^ 0 + x 2 ^ 1 +x* 2 ^ 2 + .... + x* 2 ^ n
x 为 0 或 1,所以找到x = 1 的位置,然后加上底数为 a。
代码:
#include<istream>
#include<algorithm>
using namespace std;
typedef long long LL;
int qmi(int a,int k,int p)
{
int res = 1;
while(k)
{
if(k & 1)
res = (LL)res * a % p;
k >>= 1;
a = (LL)a * a % p;
}
return res;
}
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
int a,k,p;
scanf("%d%d%d",&a,&k,&p);
printf("%d\n",qmi(a,k,p));
}
return 0;
}
快速幂求逆元
- 什么是逆元?
若整数 b,m 互质,并且对于任意的整数 a,如果满足 b|a,则存在一个整数 x,使得 a / b ≡ a * x(mod m),则称 x 为 b 的模 m 乘法逆元,记为 b−1(mod m)。
b 存在乘法逆元的充要条件是 b 与模数 m 互质。当模数 m 为质数时,bm−2 即为 b 的乘法逆元。
就是把除法转化为乘法,找到等价的这个数 x 。 - 注意:b 是 m 的倍数时就无解
- 推导:
a / b ≡ a * x (mod p)
a ≡ a * b * x (mod p)
1 ≡ b * x (mod p)
由费马定理得
b ^ (p - 1) ≡ 1 (mod p)
拆出来一个b
b * b ^ (p - 2) ≡ 1 (mod p)
所以b的逆元 x = b ^ (p - 2)
所以也是求快速幂b ^ (p - 2) mod p
b * x ≡ 1 (mod n)
#include<istream>
#include<algorithm>
using namespace std;
typedef long long LL;
int qmi(int a,int k,int p)
{
int res = 1;
while(k)
{
if(k & 1)
res = (LL)res * a % p;
k >>= 1;
a = (LL)a * a % p;
}
return res;
}
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
int a,k,p;
scanf("%d%d",&a,&p);
int res = qmi(a,p - 2,p);
if(a % p)
printf("%d\n",res);
else
puts("impossible");
}
return 0;
}

浙公网安备 33010602011771号