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

Posted MichaelZona

tags:

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

A/B

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

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

​HDU 2007-1 Programming Contest ​

 

 

Recommend

linle

 

其实此题就是求逆元,提出一点对逆元的一点:对于一个数B的逆元,可以当成 1/B 来各种计算

 

#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <queue>
#include <stack>
#include <vector>
#include <iostream>
#include "algorithm"
using namespace std;
typedef long long LL;
int cas;
LL B,n;
LL a,b,c,d,f,x,y;
LL exgcd(LL a, LL b,LL &x,LL &y)
if (b==0)
x=1;
y=0;
return a;

LL d=exgcd(b,a%b,x,y);
LL f=x;
x=y;
y=f-(a/b)*y;
return d;

int main()
freopen ("ab.in","r",stdin);
freopen ("ab.out","w",stdout);
int i,j;
scanf("%d",&cas);
while (cas--)
scanf("%lld%lld",&n,&B);
a=B,b=9973ll,c=1ll;
d=exgcd(a,b,x,y);
x=(x%(b/d)+(b/d))%(b/d);
printf("%lld\\n",(n*x)%b);

return 0;

 

以上是关于HDU-1576 A/B (扩展欧几里得求逆元)的主要内容,如果未能解决你的问题,请参考以下文章

HDU1576 A/B(乘法逆元)

hdu1576 A/B 数论

HDU - 1576(费马小定理求逆元)

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

逆元模板

hdu 1576 扩展欧几里得