数论-hdu-1576-A/B-逆元-扩展欧几里得


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


这是我第一次写逆元首先先讲一下什么是逆元

a*x≡1 mod m   其中x就是a关于模数m的逆元

此题因为A比较大,我们不能求出A/B但是我们可以求出B的逆元然后用A去乘B的逆元即可。

转换如下

bx≡1(mod m)

bx = 1 +my

bx-my=1

用扩展欧几里得求得x即可

#include<bits/stdc++.h>
#define MOD 9973
using namespace std;
/***d是最小公约数 ax+by=d x,y用了引用***/
long long extend_gcd(long long a,long long b,long long &x,long long &y)
{
    if(a==0&&b==0) return -1;
    if(b==0){
        x=1;y=0;
        return a;
    }
    long long d=extend_gcd(b,a%b,y,x);
    y-=a/b*x;
    return d;
}
/***求逆元
ax=1(mod m)***/
long long mod_reverse(long long a,long long m)
{
    long long x,y;
    long long d=extend_gcd(a,m,x,y);
    if(d==1) return (x%m+m)%m;
    else return -1;
}

int main()
{
    int t;
    int  n,B;
    scanf("%d",&t);
    while(t--) {
        scanf("%d%d",&n,&B);
        int x=mod_reverse(B,MOD);
        printf("%d\n",n*x%MOD);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值