만드는 중입니다

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

Math Encoder

면접 대비

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

요약
정렬된 수열에서 모든 비어 있지 않은 부분집합의 최댓값과 최솟값의 차이를 모두 더해 1000000007로 나눈 나머지를 구한다.
난이도

보통10점 중 6점

유형
조합론, 수학, 정렬, 누적 합
정답자
아직 제출이 없습니다

문제

Math 교수는 비밀 프로젝트를 진행하던 중, 숫자 목록을 하나의 숫자로 가장 효율적으로 인코딩해야 하는 문제에 부딪혔다. 오랜 연구 끝에 Math 교수는 숫자를 인코딩하는 가장 좋은 3단계 과정을 찾아냈다.

  1. 첫 번째 단계는 숫자 목록의 모든 공집합이 아닌 부분집합을 찾고, 각 부분집합에서 가장 큰 수와 가장 작은 수의 차이(가장 큰 수에서 가장 작은 수를 뺀 값)를 구하는 것이다. 부분집합에 숫자가 하나만 있으면 그 숫자가 가장 큰 수이자 가장 작은 수이다. 전체 집합 자체도 부분집합으로 본다.
  2. 그런 다음 모든 차이를 더해 최종 인코딩된 숫자를 얻는다.
  3. 숫자가 클 수 있으므로 109 + 7 (1000000007)로 나눈 나머지를 출력한다.

교수는 아래에 예시와 그 설명을 공유했다. 숫자 목록이 주어졌을 때, 최종 인코딩된 숫자를 계산하는 효율적인 함수를 만드는 것을 도와줄 수 있는가?

입력

입력의 첫 번째 줄에는 테스트 케이스의 수 T가 주어진다. 이어서 T개의 테스트 케이스가 주어지며, 각 테스트 케이스는 2개의 줄로 이루어진다.

  1. 첫 번째 줄에는 목록에 있는 숫자의 개수인 양의 정수 N이 주어진다.
  2. 두 번째 줄에는 비내림차순으로 정렬된 N개의 양의 정수 Ki가 주어진다.

출력

각 테스트 케이스마다 Case #x: y를 한 줄에 출력한다. 여기서 x는 테스트 케이스 번호(1부터 시작)이고, y는 최종 인코딩된 숫자이다.

출력이 매우 클 수 있으므로 결과를 소수 109 + 7 (1000000007)로 나눈 나머지만 출력하면 된다.

제한

  • 1 ≤ T ≤ 25.
  • 모든 i에 대해 1 ≤ Ki ≤ 10000.
  • 모든 i < N - 1에 대해 Ki ≤ Ki+1.

힌트

  1. 모든 부분집합을 찾고 가장 큰 수와 가장 작은 수의 차이를 구한다.

    • [3], largest-smallest = 3 - 3 = 0.
    • [6], largest-smallest = 6 - 6 = 0.
    • [7], largest-smallest = 7 - 7 = 0.
    • [9], largest-smallest = 9 - 9 = 0.
    • [3, 6], largest-smallest = 6 - 3 = 3.
    • [3, 7], largest-smallest = 7 - 3 = 4.
    • [3, 9], largest-smallest = 9 - 3 = 6.
    • [6, 7], largest-smallest = 7 - 6 = 1.
    • [6, 9], largest-smallest = 9 - 6 = 3.
    • [7, 9], largest-smallest = 9 - 7 = 2.
    • [3, 6, 7], largest-smallest = 7 - 3 = 4.
    • [3, 6, 9], largest-smallest = 9 - 3 = 6.
    • [3, 7, 9], largest-smallest = 9 - 3 = 6.
    • [6, 7, 9], largest-smallest = 9 - 6 = 3.
    • [3, 6, 7, 9], largest-smallest = 9 - 3 = 6.
  2. 이전 단계에서 계산한 차이의 합을 구한다. 3+4+6+1+3+2+4+6+6+3+6 = 44.

  3. 109 + 7 (1000000007)로 나눈 나머지를 구한다. 44 % 1000000007 = 44

예제1

  1. 예제 1

    입력
    1
    4
    3 6 7 9
    
    예상 출력
    Case #1: 44