[题解]luogu_P2613有理数取余

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int mod=19260817;
inline int read(){
    int res=0,fix=1;char ch;
    while(!isdigit(ch=getchar()))fix=ch=='-'?-1:fix;
    do{
        res=(res<<3)+(res<<1)+(ch^48);
        res%=mod;
    }
    while(isdigit(ch=getchar()));
    return res*fix;
}
ll a,b,x,y;
int exgcd(ll a,ll b,ll &x,ll &y){
    if(!b){
        x=1,y=0;return a;
    }
    int d=exgcd(b,a%b,x,y);//最大公約數 
    int z=x;x=y,y=z-y*(a/b);
    return d;
}
int main(){
    a=read(),b=read();
    if(b==0){
        printf("Angry!");return 0;
    }
    exgcd(b,mod,x,y);x=(x%mod+mod)%mod;
    printf("%lld
",((long long)(a*x))%mod);
}
/*
x同余a/b (mod p) 
=> x*b 同余 a/b*b (mod p)
=> b*x 同余 a (mod p)
若有 b*x1 同余 1(mod p)
=> b*(a*x1)同余a (mod p)
对比发现 x=a*x1
exgcd求解
a,b读入时取模
特判 
p|b时 bx mod p == 0
若p|a a mod p == 0 所以 bx 同余 a (mod p) 恒成立
若p!|a a mod p !=0 所以 此时不成立
p!|b时 b,p互质 bx1 同余 1 (mod p) 一定有解
所以当且仅当 b mod p == 0 时无解 
*/
原文地址:https://www.cnblogs.com/superminivan/p/10840620.html