HDU1576 A/B(乘法逆元)
题目的代数系统可以看作整数模9973乘法群?然后存在乘法逆元。
于是题目要求$A \div B \pmod {9973} $其实就相当于求$A \times B^{-1}\pmod {9973} $。
只要求出B的逆元就OK了。
计算模n下的乘法逆元可以用用扩展欧几里得算法求解,即解下面的线性同余方程:
$$ Ax \equiv 1 \pmod {n} $$
1 #include<cstdio> 2 #include<cstring> 3 using namespace std; 4 #define mod(x,y) (((x)%(y)+(y))%(y)) 5 #define lld long long 6 lld exgcd(lld a,lld b,lld &x,lld &y){ 7 if(b==0){ 8 x=1; y=0; 9 return a; 10 } 11 lld d=exgcd(b,a%b,x,y); 12 lld t=y; 13 y=x-a/b*y; 14 x=t; 15 return d; 16 } 17 lld ine(lld a,lld n){ 18 lld x,y; 19 exgcd(a,n,x,y); 20 return mod(x,n); 21 } 22 int main(){ 23 lld a,b; 24 int t; 25 scanf("%d",&t); 26 while(t--){ 27 scanf("%lld%lld",&a,&b); 28 printf("%lld\n",a*ine(b,9973)%9973); 29 } 30 return 0; 31 }