NOIP 2012 同餘方程 Ex_gcd

題目描述

求關於 x 的同餘方程 ax ≡ 1 (mod b)的最小正整數解。

輸入格式:

輸入只有一行,包含兩個正整數 a, b,用一個空格隔開。

輸出格式:

輸出只有一行,包含一個正整數 x0,即最小正整數解。輸入數據保證一定有解。

輸入樣例#1:

3 10

輸出樣例#1:

7

題解

對於ax1(modb) 可以轉化爲: axkb=1 ,我們可以直接用ExGcd() ,來求出一組解,然後套用同解公式不斷的變小就可以。
注意開longlong
不會擴展歐幾里得的戳

#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#define ll long long 
using namespace std;
ll a,b;
ll Gcd(ll a,ll b)
{
    if(!b) return a;
    else return  Gcd(b,a%b);
}
void Ex_Gcd(ll a,ll b,ll &x,ll &y)
{
    if(!b)
    {
        x=1;y=0;
        return ;
    }
    Ex_Gcd(b,a%b,x,y);
    int temp=x;
    x=y;
    y=temp-(a/b)*y;
    return ;
}
int main()
{
    scanf("%lld%lld",&a,&b);
    ll gcd=Gcd(a,b);
    ll x,y;
    Ex_Gcd(a,b,x,y);
    ll lcm=a*b/gcd;//通解
    while(x<0) x+=lcm/a;
    while(x-(lcm/a)>0) x-=lcm/a;
    printf("%lld",x);
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章