51nod 1256 乘法逆元(扩展欧几里得)
生活随笔
收集整理的這篇文章主要介紹了
51nod 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,如果有多個滿足條件的,輸出最小的。
Sample Input
2 3
Sample Output
2
思路:由于M和N不一定是質數,故不能用費馬小定理,應用擴展歐幾里得算法。K*M%N=1,求K即求出M對于N的乘法逆元。
代碼:
#include <iostream> using namespace std; typedef long long ll; int exgcd(int a,int b,int &x,int &y) {if(b==0){x=1;y=0;return a;}else{int r=exgcd(b,a%b,x,y);int t=x;x=y;y=t-(a/b)*x;return r;//r為ab最大公約數 } } int main() {int m,n,x,y;cin>>m>>n;exgcd(m,n,x,y);while(x<0){x+=n;//若得到的x小于0,則應使其加n,直到x>0. }cout<<x<<endl;return 0; }總結
以上是生活随笔為你收集整理的51nod 1256 乘法逆元(扩展欧几里得)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HDU1576 A/B 费马小定理
- 下一篇: 51nod 1513-3的幂的和(费马小