곱을 직접 하지 마시고, 다른 적당한 표현으로 나타내 보세요. 이를테면 105를 3×5×7로 나타내는 것처럼요. 약분을 하기 좋은 형태라면 더 좋겠죠?
17355번 - Messi An-Gimossi
아직 풀어보지는 않았습니다만,
1.(a1 * a2 * a3 * ... * an) % m 을 구하고 싶을때, 굳이 다 곱한후 나머지 연산을 할 필요는 없습니다. (a * b) % m = ((a % m) * (b % m)) % m을 만족하기 때문입니다.
2. A, B 둘 다 10^7 이하이기 때문에, A, B의 소인수도 10^7 이하입니다. 그 말은, 구한 확률을 A' / B'이라고 했을때 A', B'의 소인수도 10^7 이하라는 뜻입니다.
3. 소인수 분해는 에라토스테네스의 체를 조금 응용해서 S(n) = n의 가장 작은 소인수 을 미리 구해놓으면 꽤 효율적이게 할 수 있습니다.
시간 초과는 안날것 같은데 잘 모르겠네요
현재 작성하신 코드는 문제에서 의도했던 해법에 매우 가깝습니다. 입출력 코드에서도 특별히 문제될 점은 없는 것으로 보입니다.
다만, 이 프로그램의 수행 시간의 변동폭이 상당히 큰 것 같습니다.
이 알고리즘을 쓰는 형태로 총 5번 제출해 본 결과, 5488ms, 5628ms, 5760ms, 시간초과, 시간초과 결과를 받았습니다.
앞서 말씀드렸다시피 이 문제에서 Java 프로그램의 제한 시간이 6000ms 이며, 서버의 상황에 따라 이 제한을 넘기기도 하고 아니기도 하는 것 처럼 보입니다.
만약 시간을 확실히 줄이고 싶다면 다음 방법을 사용할 수 있습니다:
자료구조에 대해 좀 더 고민해 보면 mapA 와 mapB 를 하나의 자료구조로 합칠 수 있습니다. 예를 들어 분자를 양수로, 분모를 음수로 저장하는 건 어떨까요?
댓글을 작성하려면 로그인해야 합니다.
kwang0e 4년 전 1
Java로 BigInteger를 이용해서, 다량의 연산을 하는 것은 좋지 않다는 것은 알고 있습니다.
하지만, 문제에 나와 있는 과정대로 풀려고 생각해서 모든 연산을 완료한 후에 10^9 + 7로 나눠 줄려고 하다보니, 프로그램을 아래와 같이 BigInteger를 이용해서 풀어 버렸습니다.
당연히 시간초과가 떠버리고 말았습니다.
한번 이렇게 생각해서 그런지 다른 해법을 찾기가 너무 힘듭니다. 먹먹한 하루입니다. 약간의 언질이라도 괜찮으니, 도와주실 고수님 구합니다.