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

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

AND와 OR

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

요약
N개의 수가 주어질 때, 두 수를 비트 AND와 OR가 같은 두 음이 아닌 정수로 바꾸는 연산을 반복해 곱을 최소로 만들고 그 값을 10^9+7로 나눈 나머지를 구한다.
난이도

보통10점 중 7점

유형
비트 연산, 그리디, 수학, 정렬
정답자
아직 제출이 없습니다

문제

NN개의 수가 주어집니다. 다음과 같은 작업을 원하는 만큼 할 수 있습니다.

  • 두 수를 고르고, 이 두 수를 두 수의 bitwise AND 및 bitwise OR와 모두 같은 두 음이 아닌 정수로 바꿉니다.

작업을 마친 뒤 수들의 곱을 최소화하려고 합니다. NN개의 수의 최소화된 곱을 구하세요. 곱이 매우 커질 수 있으므로 109+710^{9} + 7로 나눈 나머지를 출력합니다.

Bitwise AND와 bitwise OR에 대한 설명은 힌트를 참고하세요.

입력

첫째 줄에 22 이상 300 000300\,000 이하인 정수 NN이 주어집니다.

둘째 줄에 NN개의 양의 정수가 공백을 사이에 두고 주어집니다. 각 정수는 2302^{30}보다 작습니다.

출력

첫째 줄에 최소화된 곱을 109+710^{9} + 7로 나눈 나머지를 출력합니다.

곱을 109+7\mathbf{10}^{\mathbf{9}} + \mathbf{7}로 나눈 나머지를 최소화하는 것이 아님에 주의하세요.

힌트

Bitwise operation은 각 연산을 비트 단위로 시행하는 것입니다.

예를 들어, 2828과 8787을 bitwise AND 연산한다고 합시다. 먼저 2828과 8787을 비트가 잘 드러나도록 2진수로 바꾸겠습니다.

0001 1100=28=28
0101 0111=87=87

각 위치의 비트를 순서대로 AND해서 아래쪽에 적습니다. AND 연산의 경우 두 비트가 모두 1이어야만 결과가 1이고, 그렇지 않은 경우 0입니다.

0001 1100=28=28
AND0101 0111=87=87
0001 0100=20=20

마찬가지로 bitwise OR 연산을 시행할 수도 있습니다. OR 연산의 경우 두 비트가 모두 0이어야만 결과가 0이고, 그렇지 않은 경우 1입니다.

0001 1100=28=28
OR0101 0111=87=87
0101 1111=95=95

예제1

  1. 예제 1

    입력
    3
    3 6 10
    
    예상 출력
    60