【擴充套件歐幾里德求不定方程】 hdoj 2669
阿新 • • 發佈:2019-01-30
擴充套件歐幾里德求不定方程 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;
}