Cod sursa(job #799854)

Utilizator mirceadinoMircea Popoveniuc mirceadino Data 20 octombrie 2012 11:07:54
Problema Algoritmul lui Euclid extins Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.96 kb
#include<cstdio>
#include<algorithm>
using namespace std;
long long int cmmdc(int A,int B)
{
    if(A<B) swap(A,B);
    if(A==B) return A;
    if(!(A&1) && !(B&1)) return 2*cmmdc(A>>1,B>>1);
    if(!(A&1)) return cmmdc(A>>1,B);
    if(!(B&1)) return cmmdc(A,B>>1);
    return cmmdc(A-B,B);
}
void euclid(long long int a,long long int b,long long int d,long long int &x,long long int &y)
{
    if(b==0)
    {
        d=a;
        x=1;
        y=0;
    }
    else
    {
        long long int x0,y0;
        euclid(b,a%b,d,x0,y0);
        x=y0;
        y=x0-(a/b)*y0;
    }
}
int main()
{
    int t;
    long long int a,b,c,d,x,y;
    freopen("euclid3.in","r",stdin);
    freopen("euclid3.out","w",stdout);
    scanf("%d",&t);
    for(;t;--t)
    {
        scanf("%lld %lld %lld",&a,&b,&c);
        d=cmmdc(a,b);
        if(c%d) {printf("0 0\n"); continue;}
        euclid(a,b,d,x,y);
        printf("%lld %lld\n",x,y);
    }
    return 0;
}