P2613 【模板】有理数取余 讲解

· · 题解

声明:

在接下来的讲述中,我会用 p 代表题中的模数 19260817

前置芝士:

正解:

解决了读入,剩下的就很简单了。

首先把题目中的式子改一下,如:

c=\dfrac{a}{b} c=ab^{-1}

将除以 b 改为乘 b 的逆元,即乘 b^{-1}。接下来就要看看逆元如何求了。这里我采用的是扩展欧几里得求逆元。

代码:

#include<bits/stdc++.h>
#define inl inline
#define reg register
#define int long long
#define rep(i,x,y) for(reg int i=x;i<=(y);++i)
#define per(i,x,y) for(reg int i=x;i>=(y);--i)
using namespace std;
const int p=19260817;
inline int rd(){
    int x=0,ch=getchar();
    while(!isdigit(ch)&&ch!=EOF) ch=getchar();
    while(isdigit(ch)) x=(x<<3)+(x<<1)+(ch-'0'),x%=p,ch=getchar();
    return x;
}
int a,b,x,y;
void exgcd(int a,int b){
    if(b==0){
        x=1;
        y=0;
        return;
    }
    exgcd(b,a%b);
    int t=x;
    x=y;
    y=t-(a/b)*y;
}
signed main(){
    a=rd();
    b=rd();
    if(b==0){  //分母不能为 0,故无解。
        cout<<"Angry!";
        return 0;
    }
    exgcd(b,p);
    x=(x%p+p)%p; //保证为正数
    cout<<a*x%p;
    return 0;
}