题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1576
题目思路: 求(A/B)%9973,等于是求B的逆元乘上n.求数的逆元可以用欧几里得算法求逆元。又因为9973是素数满足费马小定理
,即,所以b的逆元,使用快速幂即可求得。
欧几里得代码:
#include <cstdio>
using namespace std;
typedef long long ll;
const ll MOD=9973;
ll gcdExtended(ll a, ll b, ll *x, ll *y){
if (a == 0){
*x = 0;
*y = 1;
return b;
}
ll x1, y1;
ll gcd = gcdExtended(b%a, a, &x1, &y1);
*x = y1 - (b/a) * x1;
*y = x1;
return gcd;
}
int main(){
int T;scanf("%d",&T);
ll x,y,b,n;
while(T--){
scanf("%lld%lld",&n,&b);
gcdExtended(b,MOD,&x,&y);
x=(x+MOD)%MOD;
printf("%lld\n",x*n%MOD);
}
return 0;
}
费马小定理代码:
#include <cstdio>
using namespace std;
typedef long long ll;
const ll MOD = 9973;
ll power(ll a,ll n){
ll res=1;
while(n){
if(n&1) res=(res*a)%MOD;
a=(a*a)%MOD;
n>>=1;
}
return res;
}
int main(){
ll n,b;
int T;scanf("%d",&T);
while(T--){
scanf("%lld%lld",&n,&b);
//b的逆元
ll invb=power(b,MOD-2)%MOD;
ll ans=(n%MOD*invb)%MOD;
printf("%lld\n",ans);
}
return 0;
}