1. 程式人生 > >數論擴充套件歐幾里德基礎習題(4.15)

數論擴充套件歐幾里德基礎習題(4.15)

題目:

題目描述

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

輸入

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

輸出

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

樣例輸入

3 10

樣例輸出

7

思路:對題目中的式子進行變形可以得到ax - by = 1.可用擴充套件歐幾里德算出一組x,y

由於保證資料肯定有解,可知gcd(a,b) = 1

由書中可知 x` = x + kb`,y` = y + k a`.其中(a` = a/gcd(a,b),b` = b / gcd(a,b) )

long long temp = b / d;/*注:因為要求最小,依舊要滿足方程,那麼要保證當x改變,依舊是成立的。而b / d 作為x改變值,是能使得方程成立的最小值(如果肯能是負數要換成整數)*/
    x = (x % temp + temp) % temp;的方法確保是最小的整數解

get

程式碼:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <sstream>
#include <string>
#include <algorithm>
#include <list>
#include <map>
#include <vector>
#include <queue>
#include <stack>
#include <cmath>
#include <cstdlib>
using namespace std;
void gcd(long long a,long long b,long long &d,long long &x,long long &y)
{
    if(!b)
    {
        d = a,x = 1,y = 0;
    }
    else {
        gcd(b,a%b,d,y,x);
        y -= x *(a/b);
    }
}
int main()
{
   // freopen("in.txt","r",stdin);
    long long a,b;
    scanf("%lld%lld",&a,&b);
    long long d,x,y;
    gcd(a,b,d,x,y);
    long long temp = b / d;
    x = (x % temp + temp) % temp;
    printf("%lld\n",x);
    return 0;
}