A/B
思路:
水题。
A
/
B
≡
x
(
m
o
d
9973
)
A/B\equiv x \pmod {9973}
A/B≡x(mod9973)
因为
(
B
,
9973
)
=
1
(B,9973)=1
(B,9973)=1
所以
A
≡
B
x
(
m
o
d
9973
)
A\equiv Bx\pmod{9973}
A≡Bx(mod9973)
即
B
−
1
A
≡
x
(
m
o
d
9973
)
B^{-1}A\equiv x\pmod{9973}
B−1A≡x(mod9973)
而我们已知
B
B
B,就可以求
B
−
1
B^{-1}
B−1
又有
A
≡
n
(
m
o
d
9973
)
A\equiv n\pmod{9973}
A≡n(mod9973)
所以
B
−
1
n
≡
x
(
m
o
d
9973
)
B^{-1}n\equiv x\pmod{9973}
B−1n≡x(mod9973)
代码:
用扩欧实现
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
void ex_gcd(ll a,ll b,ll &x,ll &y){
if(b==0){
x=1,y=0;
return ;
}
ex_gcd(b,a%b,y,x);
y-=a/b*x;
}
ll mod_inverse(ll a,ll m){
ll x,y;
ex_gcd(a,m,x,y);
return (m+x%m)%m;//最小正整数解
}
int main(){
int t;
scanf("%d",&t);
while(t--){
ll n,b;
scanf("%lld%lld",&n,&b);
ll b_inv=mod_inverse(b,9973);
printf("%d\n",n*b_inv%9973);
}
}
关于逆元,多说几句:
求法
(1)扩欧求(原理:转化为二元一次方程,要求gcd(a,m)=1)
代码见上
(2)费马小定理求(要求m为质数)
ll inv(ll a){
return quickpow(a,mod-2);
}
(3)线性求
ll inv(ll a){
return a==1?1:(long long)(mod-mod/a)*inv(mod%a)%mod;
}
(4)(批量求法)线性求
void Inverse(int m,int inv[],int n){//线性求<=n的数%m意义下的逆元
inv[1]=1;
for(int i=2;i<=n;i++){
inv[i]=1ll*(m-m/i)*inv[m%i]%m;
}
}
逆元存在的条件
a
x
≡
1
(
m
o
d
m
)
ax\equiv 1\pmod{m}
ax≡1(modm)有解,必须有
g
c
d
(
a
,
m
)
=
1
gcd(a,m)=1
gcd(a,m)=1。
因为:这个解x同时也是
a
×
x
+
b
×
m
=
1
a\times x+b\times m=1
a×x+b×m=1的一个整数解。
而若要
a
×
x
+
b
×
m
=
c
a\times x+b\times m=c
a×x+b×m=c有解,必须有
g
c
d
(
a
,
m
)
∣
c
gcd(a,m)|c
gcd(a,m)∣c,而此时
c
=
1
c=1
c=1,那么
g
c
d
(
a
,
m
)
gcd(a,m)
gcd(a,m)只能为
1
1
1才有解。
性质
(1)不唯一
c
′
≡
c
(
m
o
d
m
)
c'\equiv c(mod m)
c′≡c(modm)也一定是a对模m的逆。
(2)完全积性函数
a
−
1
×
b
−
1
=
(
a
b
)
−
1
a^{-1}\times b^{-1}=(ab)^{-1}
a−1×b−1=(ab)−1
证明:
(3)可用于求除法取模
取模再乘以一个数的逆元取模=除以这个数最后整体取模