1. 程式人生 > >【擴充套件歐幾里德求不定方程】 hdoj 2669

【擴充套件歐幾里德求不定方程】 hdoj 2669

擴充套件歐幾里德求不定方程 hdoj 2669

題目連結http://acm.hdu.edu.cn/showproblem.php?pid=2669
題目思路:赤裸裸的求不定方程 p = m * x - n * y;
涉及到擴充套件歐幾里德求不定方程的性質:
對於不定整數方程pa+qb=c,若 c mod Gcd(a, b)=0,則該方程存在整數解,否則不存在p , q整數解。 可以想到,因為c == 1,只有gcd(n,m) == 1,才有解。
根據擴充套件歐幾里德演算法,所得到的p,q為其中一個解(且最小),而其他整數解滿足:
p = p0 + b/Gcd(p, q) * t
q = q0 - a/Gcd(p, q) * t(其中t為任意整數)
然而這題還有一個細節,x要非負數,所以你懂的,往上加b/Gcd(p, q),直到滿足。

ac程式碼:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <cmath>
#include <map>
#include <string>
using namespace std;

int exgcd(int a,int b,int& x,int& y)
{
    if(b == 0)
    {
        x = 1
;y = 0; return a; } int d = exgcd(b,a%b,x,y); int temp = x; x = y; y = temp - a/b*y; return d; } int main() { int n,m; while(~scanf("%d%d",&n,&m)) { int x,y; int ans = exgcd(n,m,x,y); if(ans == 1) { while(x<0
) { x += m; y -= n; } printf("%d %d\n",x,y); } else printf("sorry\n"); } return 0; }