hiho1530(乘法逆元)(扩展欧几里得)

Posted ACRykl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hiho1530(乘法逆元)(扩展欧几里得)相关的知识,希望对你有一定的参考价值。

#1530 : 分数取模

时间限制:1000ms
单点时限:10000ms
内存限制:256MB

描述

给定三个正整数 abp,满足 bp 互质。这时分数 a / b 除以 p 的余数,即 a / b MOD p 可以定义为 a × b-1 MOD p。  

其中b-1b 的逆元,它满足 1 ≤ b-1 < pb × b-1 ≡ 1 MOD p,满足上述条件的 b-1有且仅有一个。  

例如 2-1 ≡ 4 MOD 7,因为2 × 4 ≡ 1 MOD 7; 3-1 ≡ 3 MOD 8,因为3 × 3 ≡ 1 MOD 8。  

于是我们可以利用b-1求出a / b MOD p,例如: 3 / 2 MOD 7 = 3 × 2-1 MOD 7 = 3 × 4 MOD 7 = 5

给定三个正整数 abp,满足 bp 互质,求 a / b MOD p。  

输入

第一行包含3个正整数,abp 满足 bp 互质。  

对于30%的数据,1 ≤ a, b < p ≤ 100

对于80%的数据,1 ≤ a, b < p ≤ 100000  

对于100%的数据,1 ≤ a, b < p ≤ 1000001333

输出

输出 a / b MOD p的值。

样例输入
3 2 7
样例输出
5

这个代码使用扩展gcd求乘法逆元。

技术分享图片
#include<cstdio>
long long exgcd(long long a,long long b,long long &x,long long &y)
{//求出gcd(a,b)顺带求出一组特解使得ax+by=gcd(a,b) 
    if(b==0)
    {
        x=1;
        y=0;
        return a;
    }
    int r=exgcd(b,a%b,x,y);
    int t=x;
    x=y;
    y=t-a/b*y;
    return r;
}
int main()
{
    long long a,b,p,x,y;
    scanf("%lld%lld%lld",&a,&b,&p);
    long long r=exgcd(b,p,x,y);
    printf("%lld\n",a*((x+p)%p)%p);
    return 0;
}
View Code

 



















以上是关于hiho1530(乘法逆元)(扩展欧几里得)的主要内容,如果未能解决你的问题,请参考以下文章

求乘法逆元模板(扩展欧几里得)

python仿射变换求乘法逆元扩展欧几里得

扩展欧几里得与乘法逆元

51Nod 1256 乘法逆元(扩展欧几里得)

总结——数论:乘法逆元

扩展欧几里得算法裴蜀定理与乘法逆元