Cod sursa(job #1508380)

Utilizator timicsIoana Tamas timics Data 22 octombrie 2015 15:36:19
Problema Algoritmul lui Euclid extins Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include<iostream>
#include<stdio.h>
using namespace std;
int  T,a,b,c,sol1,sol2;
bool OK = 1;
 
int gcd(int a, int b, int &x, int &y) {
    if(b==0) {
        x=1;
        y=0;
        return a;
    }
    else {
        int x0,y0;
        int d = gcd(b,a%b,x0,y0);
        x = y0;
        y = x0 - a/b *y0;
        return d;
    }
}

int euclid(int a, int b, int c) {
    int x, y;
    int d = gcd(a,b,x,y);
    if(c%d) {
        OK = 0;
        return;
    } else {
        OK = 1;
        sol1 = (c/d)*x;
        sol2 = -(c/d)*y;
    }

    int K = -1, L = -1;
    if(sol1 < 0) {
        K = (b/d - 1 - sol1)/(b/d); 
    }
    if(sol2 < 0) {
        L = (a/d - 1 - sol2)/(a/d); 
    }
    K = max(K,L);
    if(K != -1) {
        sol1 += K*b/d;
        sol2 += K*a/d;
    }
    K = sol1 / (b/d);
    L = sol2 / (a/d);
    K = max(K,L);
    if(K > 0) {
        sol1 -= K*b/d;
        sol2 -= K*a/d;
    }
    return d;
}
 
int main() {
    freopen("euclid3.in","r",stdin);
    freopen("euclid3.out","w",stdout);
    scanf("%d",&T);
    for(int i=1;i<=T;++i) {
        OK = 1;
        scanf("%d%d%d",&a,&b,&c); 
        euclid(a,b,c);
        if(OK) {
            printf("%d %d\n",sol1,-sol2);
        } else {
            printf("%d %d\n",0,0);
        }
    }
    return 0;
}