만드는 중입니다

아직 만드는 중이라 바뀔 수 있습니다

직사각형 타일링

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

요약
W x H 직사각형을 2의 거듭제곱 크기의 정사각형으로 겹치지 않게 채울 때 필요한 정사각형 개수의 최솟값을 구하고, 불가능하면 -1을 출력합니다.
난이도

보통10점 중 7점

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

문제

정수 변 길이를 가진 직사각형을 생각하자. 직사각형의 정사각형 타일링은 변이 직사각형의 변과 평행한, 서로 겹치지 않는 정사각형으로 전체 영역을 덮는 것이다. 정사각형 타일링에서 어떤 정사각형도 직사각형의 경계를 넘어가면 안 된다.

한 변의 길이가 22의 거듭제곱인 정사각형들을 가지고 있다. 가진 정사각형으로 직사각형을 타일링할 때, 사용하는 정사각형의 개수가 가장 적은 타일링을 찾거나, 타일링이 불가능하다는 것을 알아내라.

그림 1: 처음 세 입력에 대한 최적의 정사각형 타일링. 표시가 없는 작은 타일은 1×11 \times 1 타일이다.

입력

첫 줄에 세 정수 WW, HH, NN (1≤W,H≤2501 \leq W, H \leq 2^{50}, 1≤N≤511 \leq N \leq 51)이 주어진다. WW와 HH는 직사각형의 가로와 세로 길이이다. 다음 줄에는 NN개의 정수 a0,a1,…,aN−1a_0, a_1, \ldots, a_{N-1}이 주어진다. 여기서 aia_i (0≤ai≤2510 \leq a_i \leq 2^{51})는 가진 2i×2i2^i \times 2^i 정사각형의 개수이다.

출력

가진 정사각형으로 W×HW \times H 직사각형의 정사각형 타일링이 존재하면, 그 타일링에 필요한 정사각형 개수의 최솟값을 출력한다. 존재하지 않으면 −1-1을 출력한다.

예제4

  1. 예제 1

    입력
    4 2 2
    5 1
    
    예상 출력
    5
    
  2. 예제 2

    입력
    6 7 3
    10 10 10
    
    예상 출력
    12
    
  3. 예제 3

    입력
    17 20 5
    20 0 4 0 1
    
    예상 출력
    25
    
  4. 예제 4

    입력
    4 2 3
    3 1 10
    
    예상 출력
    -1