Cod sursa(job #3298959)

Utilizator tudorboscuTudor Boscu tudorboscu Data 3 iunie 2025 15:34:59
Problema Algoritmul lui Euclid extins Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.65 kb
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>

//este cumva o varianta mai generala a inversului modular, aici dupa egal nu o sa mai fie 1, o sa fie o necunoscuta 'c'



long long euclid_extins(long long a, long long b, long long *x, long long *y)
{
    if (b == 0){   // in cazul asta avem a * 1 + 0 = c
        *x = 1;
        *y = 0;
        return a;
    }
    else{ //rotim a si b;
        long long x0, y0, res;
        res = euclid_extins(b, a % b, &x0, &y0);

        *x = y0;
        *y = x0 - (a / b) * y0;
        return res;
    }

}

int main(void)
{
    FILE *fin = fopen("euclid3.in", "r");
    FILE *fout = fopen("euclid3.out", "w");

    long long T; // intre 1 si 100
    fscanf(fin, "%lld", &T);
    // scanf("%lld", &T);
    // getchar();

    for(uint16_t i = 0; i < T; i++)
    {
        long long a, b, c;
        // scanf("%lld %lld %lld", &a, &b, &c);
        // printf("a = %lld, b = %lld, c = %lld\n", a, b, c);
        // getchar();
        fscanf(fin, "%lld %lld %lld", &a, &b, &c);
        
        long long x;
        long long y;
        long long res;

        res = euclid_extins(a, b, &x, &y);   //obtinem res si tratam in functie de inputul de lla c
        
        // if (res < 0){   // ca sa nu avem probleme cu semnele negative
        //     res = -res;
        //     x = x;
        //     y = y;
        // }

        if (c % res){
            // printf("0 0\n");
            fprintf(fout, "0 0\n");
        }
        else{

            // printf("%lld %lld\n", (x * (c / res)), (y * (c / res)));
            fprintf(fout, "%lld %lld\n", (x * c / res), (y * c / res));
        }
    }


    fclose(fin);
    fclose(fout);
    return 0;
}