码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2018-04-06 23:56:44      阅读:352      评论:0      收藏:0      [点我收藏+]

标签:open   print   return   输入   扩展   限制   one   代码   default   

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

标签:open   print   return   输入   扩展   限制   one   代码   default   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!