문제 출처: https://www.acmicpc.net/problem/6064
문제 풀이 참고 출처: http://mygumi.tistory.com/325
그냥 풀면 시간초과가 난다.
x를 먼저 맞추고, y만을 신경쓴다.
그렇게 되면 y는 M만큼 증가하고, y를 N으로 나머지 연산을 하면, y의 값을 알 수 있다.
마지막 해는 최소공배수이다. M=10, N=12일 때 10과 12의 최소공배수는 60이다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | import java.io.BufferedReader; import java.io.InputStreamReader; public class Main { public static void main(String[] args) throws Exception { BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); int T = Integer.parseInt(reader.readLine()); StringBuilder builder = new StringBuilder(); for(int n=0 ; n<T ; n++){ String[] input = reader.readLine().split(" "); int M = Integer.parseInt(input[0]); int N = Integer.parseInt(input[1]); int x = Integer.parseInt(input[2]); int y = Integer.parseInt(input[3]); int count = x, j = x, lcm = lcm(M, N); // x를 먼저 맞춘다. for(int i=0 ; i<lcm/M ; i++){ int tempY = j % N == 0 ? N : j % N; // y를 N으로 나머지 연산 if (tempY == y) break; count += M; j = tempY + M; } count = (count > lcm) ? -1 : count; // count가 마지막 해보다 크면 -1 builder.append(count).append("\n"); } System.out.println(builder); } public static int lcm(int num1, int num2) { // 최소공배수 구하기 int a = num1, b = num2; while (b != 0) { int temp = a % b; a = b; b = temp; } return num1 * num2 / a; } } | cs |
'Algorithm' 카테고리의 다른 글
백준 1966번: 프린터 큐 (0) | 2018.10.25 |
---|---|
백준 10845번: 큐 (0) | 2018.10.25 |
백준 1475번: 방 번호 (0) | 2018.10.24 |
백준 2775번: 부녀회장이 될테야 (0) | 2018.10.24 |
백준 1193번: 분수찾기 (0) | 2018.10.24 |