51Nod 1256 乘法逆元

题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1256

给出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

题解:扩展GCD
 1 #include <iostream>
 2 #include <algorithm>
 3 #include <cstring>
 4 #include <cstdio>
 5 #include <vector>
 6 #include <cstdlib>
 7 #include <iomanip>
 8 #include <cmath>
 9 #include <ctime>
10 #include <map>
11 #include <set>
12 #include <queue>
13 using namespace std;
14 #define lowbit(x) (x&(-x))
15 #define max(x,y) (x>y?x:y)
16 #define min(x,y) (x<y?x:y)
17 #define MAX 100000000000000000
18 #define MOD 1000000007
19 #define pi acos(-1.0)
20 #define ei exp(1)
21 #define PI 3.141592653589793238462
22 #define INF 0x3f3f3f3f3f
23 #define mem(a) (memset(a,0,sizeof(a)))
24 typedef long long ll;
25 ll gcd(ll a,ll b){
26     return b?gcd(b,a%b):a;
27 }
28 bool cmp(int x,int y)
29 {
30     return x>y;
31 }
32 const int N=10005;
33 const int mod=1e9+7;
34 /*
35  *  扩展欧几里得法(求ax + by = gcd)
36  */
37 //  返回d = gcd(a, b);和对应于等式ax + by = d中的x、y
38 ll extendGcd(ll a,ll b,ll &x,ll &y)
39 {
40     if (a == 0 && b == 0){
41         return -1; //  无最大公约数
42     }
43     if (b == 0){
44         x = 1;
45         y = 0;
46         return a;
47     }
48     ll d = extendGcd(b, a % b, y, x);
49     y -= a / b * x;
50     return d;
51 }
52 //  求逆元 ax = 1(mod n)
53 ll modReverse(ll a, ll n)
54 {
55     ll x, y;
56     ll d = extendGcd(a, n, x, y);
57     if (d == 1){
58         return (x % n + n) % n;
59     }
60     else{
61         return -1;  //  无逆元
62     }
63 }
64 int main()
65 {
66     ll M, N;
67     while (cin >> M >> N){
68         cout << modReverse(M, N) << endl;
69     }
70     return 0;
71 }
时间: 2024-11-05 21:37:25

51Nod 1256 乘法逆元的相关文章

51Nod 1256 乘法逆元 Label:exgcd

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示例

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示例

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

1 #include <iostream> 2 #include <algorithm> 3 4 using namespace std; 5 typedef long long LL; 6 7 //给予二整数 a 与 b, 必存在有整数 x 与 y 使得ax + by = gcd(a,b) 8 LL extgcd(LL a, LL b, LL &x, LL &y){ 9 LL d = a; 10 if (b != 0){ 11 d = extgcd(b, a%b,

51nod 125乘法逆元 (扩展欧几里得)

给出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 思路: 对于正整数和,如果有,那么把这个同余方程中的最小正整数解叫做

51nod1256乘法逆元

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

关于逆元的概念、用途和可行性的思考(附51nod 1013 和 51nod 1256)

[逆元的概念] 逆元和单位元这个概念在群中的解释是:  逆元是指数学领域群G中任意一个元素a,都在G中有唯一的逆元a',具有性质a×a'=a'×a=e,其中e为该群的单位元. 群的概念是:  如果独异点(幺半群)中每一个元素都有逆元,那么这个独异点(幺半群)叫做群. 独异点(幺半群):  有单位元的半群. 半群:  可结合的代数系统.即 ,有 . 代数系统:我的理解是代数系统包含一个数的集合A和至少一个运算规则,所有的运算都是封闭的,不会产生不在A集合中的数. 我们知道的实数集合R和加减乘除等一

HDU3037 Saving Beans(Lucas定理+乘法逆元)

题目大概问小于等于m个的物品放到n个地方有几种方法. 即解这个n元一次方程的非负整数解的个数$x_1+x_2+x_3+\dots+x_n=y$,其中0<=y<=m. 这个方程的非负整数解个数是个经典问题,可以+1转化正整数解的个数用插板法解决:$C_{y+n-1}^{n-1}=C_{y+n-1}^y$. 而0<=y<=m,最后的结果就是—— $$\sum_{i=0}^m C_{i+n-1}^i$$ $$C_{n-1}^0+C_{n}^1+C_{n+1}^2+\dots+C_{n-1

UVa 11174 (乘法逆元) Stand in a Line

题意: 有n个人排队,要求每个人不能排在自己父亲的前面(如果有的话),求所有的排队方案数模1e9+7的值. 分析: <训练指南>上分析得挺清楚的,把公式贴一下吧: 设f(i)为以i为根节点的子树的排列方法,s(i)表示以i为根的子树的节点总数. f(i) = f(c1)f(c2)...f(ck)×(s(i)-1)!/(s(c1)!s(c2)!...s(ck)!) 按照书上最开始举的例子,其实这个式子也不难理解,就是先给这些子树确定一下位置,即有重元素的全排列. 子树的位置确定好以后,然后再确定

LightOJ - 1050 (唯一分解+推公式+乘法逆元)

题意:求a^b的所有约数和对1e9+7取模的结果 思路:对于一个数p,进行唯一分解,则p=P1^M1*P2^M2*...*Pn^Mn,则p的所有约数之和等于(P1^0+P1^1+...+P1^M1)*(P2^0+P2^1+...+P2^M2)*...*(Pn^0+Pn^1+...+Pn^Mn), p^t=P1^(M1*t)*P2^(M2*t)*...*Pn^(Mn*t),每一个(Pn^0+Pn^1+...+Pn^Mn)利用等比数列可以直接推出公式为(Pn^(Mn*t+1)-1)/(Pn-1),用