【模板】费马小定理

这篇博客主要介绍了如何利用费马小定理和快速幂算法解决大数除法模运算的问题。在给定A对10007取模的值n和整数B的情况下,通过快速幂计算(A/B)模10007的结果。博主给出了详细的过程和代码实现,包括取余运算的加减乘法规则以及快速幂的运用,帮助读者理解如何在实际编程中高效地进行大数计算。
摘要由CSDN通过智能技术生成

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 % p − b % p ) % p (a-b)\%p=(a\%p-b\%p)\%p (ab)%p=(a%pb%p)%p

( a ∗ b ) % p = ( ( a % p ) ∗ ( b % p ) ) % p (a*b)\%p=((a\%p)*(b\%p))\%p (ab)%p=((a%p)(b%p))%p

( a / b ) % p = ( a ∗ b − 1 % p ) % p (a/b)\%p=(a*b^{-1}\%p)\%p (a/b)%p=(ab1%p)%p

( a b ) % p = ( ( a % p ) b ) % p (a^b)\%p=((a\%p)^b)\%p (ab)%p=((a%p)b)%p

延伸公式1:

( n ∗ a p − 1 ) % p = n % p (n*a^{p-1})\%p=n\%p (nap1)%p=n%p

延伸公式2:

( a p − 2 ) % p = a − 1 % p (a^{p-2})\%p=a^{-1}\%p (ap2)%p=a1%p

延伸公式3:

a b % p = a b % ( p − 1 ) % p a^b\%p=a^{b\%(p-1)}\%p ab%p=ab%(p1)%p

公式原理:令k=A/B

( A / B ) % p = k % p (A/B)\%p=k\%p (A/B)%p=k%p

= k ∗ B p − 1 ) % p =k*B^{p-1})\%p =kBp1%p

= ( A ∗ B p − 2 ) % p =(A*B^{p-2})\%p =(ABp2)%p

= [ ( A % p ) ∗ ( B p − 2 ) % p ] % p =[(A\%p)*(B^{p-2})\%p]\%p =[(A%p)(Bp2)%p]%p

= [ n ∗ ( B p − 2 ) ] % p =[n*(B^{p-2})]\%p =[n(Bp2)]%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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gy-7

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值