HDU-1576 A/B(逆元模板:扩展欧几里得写法)

题目链接:Problem - 1576 (hdu.edu.cn)

题目:

题目样例:

 

 题目思路:

因为b的范围在1--1e9。除以一个很大的数会有精度问题,所以需要逆元(将除法变成乘法)。

扩展欧几里得求逆元模板:

int ex_gcd(int a,int b,int &x,int &y){
    if(b==0){
        x=1;
        y=0;
        return a;
    }
    int d=ex_gcd(b,a%b,x,y);
    int temp=x;
    x=y;
    y=temp-(a/b)*y;
    return d; 
}

ps:函数进行的结果x为a的逆元,b为mod数

AC:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=1e5+5;
int t,a,b,x,y;
int ex_gcd(int a,int b,int &x,int &y){
    if(b==0){
        x=1;
        y=0;
        return a;
    }
    int d=ex_gcd(b,a%b,x,y);
    int temp=x;
    x=y;
    y=temp-(a/b)*y;
    return d; 
}
int main(){
    cin>>t;
    while(t--){
        cin>>a>>b;
        ex_gcd(b,9973,x,y);
        x=(x%9973+9973)%9973;
        cout<<(a*x)%9973<<endl;
    }
    return 0;
} 

猜你喜欢

转载自blog.csdn.net/m0_63569670/article/details/127875978