HDU——T 1576 A/B

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU——T 1576 A/B相关的知识,希望对你有一定的参考价值。

http://acm.hdu.edu.cn/showproblem.php?pid=1576

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


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
 

 

Author
xhd
 

 

Source
 
膜的性质+逆元

(a/b)mod p=?
定义 c为b在mod p意义下的逆元
=a*c mod p = (a mod p * c mod p)mod p

① exgcd求逆元

 1 #include <algorithm>
 2 #include <cstdio>
 3 
 4 using namespace std;
 5 
 6 const int mod(9973);
 7 int T,n,b,x,y;
 8 
 9 int exgcd(int a,int b,int &x,int &y)
10 {
11     if(!b)
12     {
13         x=1; y=0;
14         return a;
15     }
16     int ret=exgcd(b,a%b,x,y);
17     int tmp=x; x=y;
18     y=tmp-a/b*y;
19     return ret;
20 }
21 
22 int main()
23 {
24     scanf("%d",&T);
25     for(;T--;)
26     {
27         scanf("%d%d",&n,&b);
28         int gcd=exgcd(b,mod,x,y);
29         x*=gcd;
30         x=(x%mod+mod)%mod;
31         printf("%d\n",(x*n)%mod);
32     }
33     return 0;
34 }

 ② 欧拉定理求逆元

 1 #include <algorithm>
 2 #include <cstdio>
 3 
 4 using namespace std;
 5 
 6 #define LL long long
 7 const int mod(9973);
 8 int T,n,b;
 9 
10 LL phi(LL x)
11 {
12     LL ret=1;
13     for(LL i=2;i*i<=x;i++)
14         if(x%i==0)
15         {
16             x/=i;
17             ret*=i-1;
18             for(;x%i==0;)
19                 ret*=i,x/=i;
20         }
21     if(x>1) ret*=x-1;
22     return ret;
23 }
24 LL Q_pow(LL a,LL b)
25 {
26     LL ret=1,base=a;
27     for(;b;b>>=1)
28     {
29         if(1&b) ret=(ret*base)%mod;
30         base=(base*base)%mod;
31     }
32     return ret;
33 }
34 
35 int main()
36 {
37     scanf("%d",&T);
38     for(;T--;)
39     {
40         scanf("%d%d",&n,&b);
41         LL x=Q_pow((LL)b,(LL)phi((LL)mod)-1);
42         x=(x%mod+mod)%mod;
43         printf("%d\n",(x*n)%mod);
44     }
45     return 0;
46 }

 

以上是关于HDU——T 1576 A/B的主要内容,如果未能解决你的问题,请参考以下文章

HDU-1576 A/B 基础数论+解题报告

HDU 1576 A/B(欧几里德算法延伸)

hdu1576 A/B 数论

hdu 1576 A/B (扩展欧几里得)(还得再看看)

HDU 1576 A/B(扩展欧几里得 求 逆元)

HDU - 1576 A/B(扩展欧几里得算法)