51nod 1256 乘法逆元 拓展欧几里得求逆元

1256 乘法逆元

基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题

给出2个数M和N(M < N),且M与N互质,找出一个数K满足0 < K < N且K * M % N = 1,如果有多个满足条件的,输出最小的。

Input

输入2个数M, N中间用空格分隔(1 <= M < N <= 10^9)

Output

输出一个数K,满足0 < K < N且K * M % N = 1,如果有多个满足条件的,输出最小的。

Input示例

2 3

Output示例

2思路:套模板。。。该模板来自《挑战编程》,里面有详细的解释。 真的很快啊0msa, m 互质。
#include <iostream>
#include <cstdio>

using namespace std;
int extgcd(int a, int b, int &x, int &y){
    int d = a;
    if(b != 0){
        d = extgcd(b, a%b, y, x);
        y -= (a/b)*x;
    }else {
        x = 1, y = 0;
    }return d;
}
int mod_inv(int a, int m){
    int x, y;
    extgcd(a, m, x, y);
    return (m+x%m)%m;
}
int main() {
    int n, m;
    scanf("%d%d", &m, &n);
    printf("%d\n", mod_inv(m, n));
    return 0;
}
 
时间: 2024-11-04 16:32:27

51nod 1256 乘法逆元 拓展欧几里得求逆元的相关文章

拓展欧几里得求逆元与阶乘逆元求法

目录 什么是逆元 如何求逆元 阶乘逆元 本文章内,若无特殊说明,数字指的是整数,除法指的是整除. 什么是逆元 我们称\(a\)是\(b\)在模\(p\)情况下的逆元,则有\(a \times b \equiv 1 ( mod\,\,p)\). 所以呢,我们其实可以将逆元看成一个数的相反数.所以在除以一个数的时候,就相当于乘上它的相反数. 如何求逆元 我们先来看看什么情况下有逆元. 当且仅当\(gcd(b,p)=1\)时,\(b\)在模\(p\)情况下有逆元. 这个结论可由裴蜀定理显然推得,下面一

hdu_1576A/B(扩展欧几里得求逆元)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1576 A/B Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4020    Accepted Submission(s): 3091 Problem Description 要求(A/B)%9973,但由于A很大,我们只给出n(n=A%99

暑期学习日记二—利用扩展欧几里得求逆元

最近学习了扩展欧几里得和乘法逆元的关系,在这里写一下巩固一下记忆 扩展欧几里得是什么呢,在这就不详解了,可以自行百度,主要来说,对于 求解ax ≡ 1(mod n)来说,当gcd(a,n)=1时,证明逆元存在,若不等于1,则证明逆元不存在. 那么当逆元存在时,我们要如何求它的逆元呢? 首先是扩展欧几里得定理,先将式子转换成 ax-ny = 1 的形式,然后我们要通过扩展欧几里得定律去获得它的最大公约数,还有它的一组解 X0,Y0 1 int exgcd(int a, int b, int &x,

hdu1576 A/B 扩展欧几里得求逆元

//(a/b)%c ==> a%c = (b*k) %c; // k = (a*(b_1))%c ,b_1为b的逆元 #include<cstdio> #include<cstring> #include<iostream> using namespace std ; const int mod = 9973 ; typedef __int64 ll; int exgcd(int a ,int b , ll &x ,ll &y) { if(b ==

uva 10413 - Crazy Savages(拓展欧几里得)

题目链接:uva 10413 - Crazy Savages 题目大意:一座山有m个山洞,形成一个圈,现在有n个部落的人,每个部落一开始住在ci山洞,第2天会向后面移动pi个位置,一共会在这座山住li天.现在如果两个部落在同一个山洞相遇,则会发生战争,问说m最小时多少的时候,保证不会发生争斗. 解题思路:因为每个部落都有自己的存在时间,所以枚举m,然后枚举两个部落,判断他们有没有可能相遇. 假设在第k天: ci+k?pi=a?m???(1) cj+k?pj=b?m???(2) 由(2)-(1)得

POJ 1061 青蛙的约会(拓展欧几里得)

青蛙的约会 Time Limit: 1000MS   Memory Limit: 10000KB   64bit IO Format: %I64d & %I64u Submit Status Description 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件很重要的事情,既没有问清楚对方的特征,也没有约定见面的具体位置.不过青蛙们都是很乐观的,它们觉得只要一直朝着某个方向跳

青蛙的约会 POJ1061(拓展欧几里得)

两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件很重要的事情,既没有问清楚对方的特征,也没有约定见面的具体位置.不过青蛙们都是很乐观的,它们觉得只要一直朝着某个方向跳下去,总能碰到对方的.但是除非这两只青蛙在同一时间跳到同一点上,不然是永远都不可能碰面的.为了帮助这两只乐观的青蛙,你被要求写一个程序来判断这两只青蛙是否能够碰面,会在什么时候碰面. 我们把这两只青蛙分别叫做青蛙A和

bzoj4517: [Sdoi2016]排列计数--数学+拓展欧几里得

这道题是数学题,由题目可知,m个稳定数的取法是Cnm 然后剩下n-m本书,由于编号为i的书不能放在i位置,因此其方法数应由错排公式决定,即D(n-m) 错排公式:D[i]=(i-1)*(D[i-1]+D[i-2]); 所以根据乘法原理,答案就是Cnm * D(n-m) 接下来就是怎么求组合数的问题了 由于n≤1000000,因此只能用O(n)的算法求组合,这里用乘法逆元(inv[])来辅助求组合数 即 Cnm = n! / ((n-m)! * m!) = fac[n]*inv[n-m]*inv[

(转)拓展欧几里得讲解

拓展欧几里得 扩展欧几里得算法介绍: 前置知识:欧几里得算法(其实就是辗转相除法,用于计算两个整数a,b的最大公约数.) 欧几里得算法: 在开始之前,我们先说明几个定理: gcd(a,b)=gcd(b,a)=gcd(-a,b)=gcd(|a|,|b|) 公式表述及证明 gcd(a,b)=gcd(b,a mod b) 证明:a可以表示成a = kb + r,则r = a mod b 假设d是a,b的一个公约数,则有 d|a, d|b,而r = a - kb,因此d|r 因此d是(b,a mod b