A/B(逆元)

A/B

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 5539    Accepted Submission(s): 4320


Problem Description
要求(A/B)%9973,但由于A很大,我们只给出n(n=A%9973)(我们给定的A必能被B整除,且gcd(B,9973) = 1)。
 

 

Input
数据的第一行是一个T,表示有T组数据。
每组数据有两个数n(0 <= n < 9973)和B(1 <= B <= 10^9)。
 

 

Output
对应每组数据输出(A/B)%9973。
 

 

Sample Input
2
1000 53
87 123456789
 

 

Sample Output
7922
6060
 
 
 
就是问你会不会求模的逆元,A/B 的模不能直接除了就取余,要当做 (A* (1/B) )%m 所以就是求 1/B(即B关于MOD的乘法逆元)
费马小定理:  当m为质数的时候  A^(m-1) = 1   (mod m) 即  A^(m-2) = 1/A  (mod m)    两边都余 m
 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <string.h>
 4 
 5 using namespace std;
 6 
 7 #define MOD 9973
 8 
 9 int main()
10 {
11     int T;
12     cin>>T;
13     while(T--)
14     {
15         int a,b;
16         scanf("%d%d",&a,&b);
17         b%=MOD;
18         int c = b;
19         for (int i=0;i<MOD-3;i++)
20             c = (c*b)%MOD;
21         a = (a*c)%MOD;
22         printf("%d
",a);
23     }
24     return 0;
25 }
View Code

 还可以用扩展欧几里得求逆元,a*x = 1 (mod m) , x 是 a 的逆元,然后,方程等价于 a*x + m*y = 1 (mod m),扩展欧几里得可求得 x0 ,((x0% m)+m)%m 就是最小整数解

 1 #include <stdio.h>
 2 #include <iostream>
 3 #include <stdlib.h>
 4 using namespace std;
 5 #define MOD 9973
 6 
 7 int exgcd(int a,int b,int &x,int &y)
 8 {
 9     if (b==0)
10     {
11         x=1;
12         y=0;
13         return a;
14     }
15     int r = exgcd(b,a%b,y,x);
16     y-=(a/b)*x;
17     return r;
18 }
19 
20 int main()
21 {
22     int T;
23     cin>>T;
24     while (T--)
25     {
26         int a,b;
27         cin>>a>>b;
28         int x,y;
29         int r = exgcd(b,MOD,x,y);
30         x=(x%MOD+MOD)%MOD;
31         cout<<a*x%MOD<<endl;
32     }
33     return 0;
34 }
View Code
原文地址:https://www.cnblogs.com/haoabcd2010/p/6670786.html