【模板】费马小定理
C~K的难题:费马小定理+快速幂
Problem Description
众所周知 C~K 喜欢数学,但是他最近被一个题给难住了,题目是这样的。
要求 (A/B)%10007,但由于 A 很大,我们只给出 n (n = A%10007)(我们给定的A必能被B整除,且 gcd(B,10007) = 1)。
你能帮助他解答吗?他会很感谢你的。
Input
数据的第一行是一个 T,表示有 T 组数据。
每组数据有两个数 n (0 <= n < 10007) 和 B (1 <= B <= 10^9)。
Output
对应每组数据输出 (A/B)%10007。
Sample Input
2
1000 53
87 123456789
Sample Output
8893
7424
费马小定理: 假如p是质数,且gcd(a,p)=1,那么 a^(p-1)≡1(mod p) 两边都mod p;
即:假如a是整数,p是质数,且a,p互质(即两者只有一个公约数1),那么a的(p-1)次方除以p的余数恒等于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*b^{-1}\%p)\%p
\]
\[(a^b)\%p=((a\%p)^b)\%p
\]
延伸公式1:
\[(n*a^{p-1})\%p=n\%p
\]
延伸公式2:
\[(a^{p-2})\%p=a^{-1}\%p
\]
延伸公式3:
\[a^b\%p=a^{b\%(p-1)}\%p
\]
题目解法:令k=A/B
\[(A/B)\%p=k\%p
\]
\[=k*B^{p-1})\%p
\]
\[=(A*B^{p-2})\%p
\]
\[=[(A\%p)*(B^{p-2})\%p]\%p
\]
\[=[n*(B^{p-2})]\%p
\]
第二行:延伸公式1的逆用,只要公式里的a与p互质即可,因为题目中的B与p互质,所以可以用题目中的B来代替公式中的a。
第三行:把k化简开,化成A/B
第四行:取余乘法的分配律
代码:
#include<iostream>
#include<algorithm>
using namespace std;
#define ll long long
int qmi(ll a, ll b, ll mod) { //快速幂
ll flag = 1;
while (b) {
if (b & 1)flag = (flag*a) % mod;
a = (a*a) % mod;
b = b >> 1;
}
return flag%mod;
}
int main() {
int t, n, b,mod=10007;
cin >> t;
while (t--) {
cin >> n >> b;
cout << n*qmi(b, mod-2, mod) % mod << "\n";
}
return 0;
}