Hard deck/리포트

045 : Extended Euclidean algorithm

서버관리자 페페 2022. 8. 3. 15:39
(Briefing)
문제 단 하나의 맥락 입출력과 되어야 하는 그림
Ax + By = C 를 만족하는 (x, y) 쌍을 찾아라   I //
A B C

O //
(존재x) -1
(존재) (x, y)
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws Exception {

        // Input Supply Cable
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st = new StringTokenizer(br.readLine());

        // Preprocessing
        int A = Integer.parseInt(st.nextToken());
        int B = Integer.parseInt(st.nextToken());
        int C = Integer.parseInt(st.nextToken());

        // Operating GCD(1/2)
        long GCD = GCD(Math.max(A, B), Math.min(A, B));

        // Operating Extended Euclidean(2/2) + OE Cable
        if (C % GCD != 0) {
            System.out.println(-1);
        }  else {
            int Quotient = ((int) (C / GCD));
            long [] ret = Extended(A, B);
            System.out.println(ret[0]*Quotient + " " + ret[1]*Quotient);
        }
    }

    // External Module(1/2)
    private static long[] Extended(long A, long B) {
        long [] ret = new long[2];
        if (B == 0) {
            ret[0] = 1; ret[1] = 0;
            return ret;
        }
        long Q = A/B;
        long[] V = Extended(B, A%B);
        ret[0] = V[1];
        ret[1] = V[0] - V[1]*Q;
        return ret;
    }
    
    // External Module(1/2)
    private static long GCD(long B, long S) {
        long r = B % S;
        while (r != 0) {
            r = B%S;
            B = S;
            S = r;
        }
        return Math.abs(B);
    }
}

'Hard deck > 리포트' 카테고리의 다른 글

047 : 효율적으로 해킹하기  (2) 2022.08.08
046 : 특정 거리의 도시 찾기  (0) 2022.08.08
044 : Cocktail  (0) 2022.08.03
041 : Euler phi  (2) 2022.08.03
040 : 제곱이 아닌 수 찾기  (3) 2022.07.30