A Number Theoretical Problem

 

 知识点:逆元+拓展欧几米得算法

当方程符合ax+by=gcd(a,b)时,可以采用欧几里得算法求(x,y)

代码:

#include<iostream>
#include <algorithm>
#include <stdio.h>
#define ll long long
using namespace std;
ll exgcd(ll a,ll b,ll &x,ll &y)//扩展欧几里得算法,求x,y
{
    if(b==0)
    {
        x=1,y=0;
        return a;
    }
    ll ret=exgcd(b,a%b,y,x);
    y-=a/b*x;
    return ret;
}
ll getinv(int a,int mod)//求a在mod下的逆元,不存在逆元返回-1
{
    ll x,y;
    ll d=exgcd(a,mod,x,y);
    return d==1?(x%mod+mod)%mod:-1;
}
int main(){
    int t;
    scanf("%d",&t);
    while (t--) {
        ll a,b;
        scanf("%lld%lld",&a,&b);
        printf("%lld\n",getinv(a,b));
    }
    return 0;
}

 
 

  

posted @ 2020-06-07 23:03  心不懈  阅读(145)  评论(0)    收藏  举报