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)。
每组数据有两个数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 }
还可以用扩展欧几里得求逆元,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 }