아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

오버플로우와 모듈러

면접 대비

시간 제한1초메모리 제한512 MB

요약
N개의 정수를 곱한 값을 M으로 나눈 나머지를 구한다. 곱할 때마다 나머지를 취해 오버플로를 피한다.
난이도

쉬움10점 중 2점

유형
수학, 구현, 정수론, 완전 탐색
정답자
아직 제출이 없습니다

문제

정수 오버플로란 정수형 변수가 연산 중에 표현할 수 있는 범위를 벗어나 의도와 다른 값이 저장되는 현상이다. 변수의 타입과 함께 그 크기가 미리 정해지는 C, C++, Java와 같은 언어에서 종종 발생한다.

일반적인 4바이트 정수형이 표현할 수 있는 가장 큰 양의 정수는 231−1=21474836472^{31}-1 = 2147483647이다. 그런데 4바이트 정수 변수에 담긴 10000001000000과 10000001000000을 곱하면 어떻게 될까? 정확한 곱은 1000000×1000000=10000000000001000000 \times 1000000 = 1000000000000이지만, 이 값은 이미 표현 범위를 벗어났으므로 원하는 결과가 나오지 않고 해당 타입이 표현 가능한 다른 값으로 바뀌어 저장된다.

이를 피하는 첫 번째 방법은 더 넓은 범위의 정수 타입을 쓰는 것이다. 예를 들어 C와 C++의 long long, Java의 long을 쓰면 −263-2^{63}부터 263−12^{63}-1까지의 정수를 표현할 수 있다. 또한 Python처럼 타입에 메모리 제한이 없어 오버플로를 신경 쓰지 않아도 되는 언어도 있다.

이 문제에서는 NN개의 정수를 곱한다. 정수의 곱은 매우 빠르게 커지므로 일반적인 정수 변수로 표현할 수 있는 범위를 쉽게 넘어간다. 그래서 다음 합동식을 이용해 NN개의 정수를 곱한 값을 MM으로 나눈 나머지를 구하자.

(A×B) mod M=((A mod M)×(B mod M)) mod M(A \times B) \bmod M = ((A \bmod M) \times (B \bmod M)) \bmod M

NN개의 정수와 MM이 주어질 때, 모든 정수의 곱을 MM으로 나눈 나머지를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 연산할 정수의 개수 NN (1≤N≤1001 \le N \le 100)과 MM (1≤M≤21474836471 \le M \le 2147483647)이 주어진다. 둘째 줄에 NN개의 정수 aia_i (1≤ai≤21474836471 \le a_i \le 2147483647)가 공백으로 구분되어 한 줄로 주어진다.

출력

NN개의 정수의 곱을 MM으로 나눈 나머지를 한 줄에 출력한다.

예제3

  1. 예제 1

    입력
    1 10
    9999
    
    예상 출력
    9
    
  2. 예제 2

    입력
    2 1000000007
    2147483647 2147483647
    
    예상 출력
    850618742
    
  3. 예제 3

    입력
    10 9999
    100 100 100 100 100 100 100 100 100 100
    
    예상 출력
    1