首页 > 其他 > 详细

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

时间:2018-04-06 23:29:31      阅读:260      评论:0      收藏:0      [点我收藏+]

#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(乘法逆元)(扩展欧几里得)

原文:https://www.cnblogs.com/ACRykl/p/8729252.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!