ページが読み込まれませんか? こちらをクリックすると直るかもしれません。
Placeholder

#10383

헥사코인 잼 90s 1024MB

問題

Code Jam 팀의 첫 번째 암호화폐인 jamcoin은 끝내 인기를 끌지 못했다. 올해는 16진법을 사용한다는 점에서 이름을 딴 hexacoin으로 다시 도전한다! D자리(hex) hexacoin을 "채굴"하려면, 필요하다면 앞에 0을 붙이더라도 정확히 D개의 16진수 자리로 표현되는 정수들만 다뤄야 한다. 각 값은 0 이상 16D - 1 이하의 정수를 나타낸다. 16진수 자리는 일반적으로 그렇듯 0부터 9까지의 숫자와 대문자 A부터 F까지의 글자로 표현한다. 예를 들어 D=3일 때 F2B, 0C8, 000은 모두 유효한 값이며, 각각 10진수로 3883, 200, 0에 해당한다. 반면 D=3일 때 1234, DF, C0DE, JAM은 유효한 값이 아니다.

D자리 16진수 값끼리 덧셈을 할 때는, 자릿수 넘침(overflow)으로 생기는 더 높은 자리들은 버린다. 즉, 덧셈은 16D로 나눈 나머지(modulo)로 계산된다. 예를 들어 F2B + 0C8 = FF3(10진수로 4083)이고, F2B + F2B = E56이다(10진수로는 3670인데, 합의 10진수 값은 7766이고 163으로 나눈 나머지가 3670이기 때문이다).

D자리 hexacoin을 "채굴"하기 위해 컴퓨터는 다음 과정을 수행한다.

  1. D자리 16진수 값 N개로 이루어진 목록 L ( L1, L2, ..., LN )을 선택한다.
  2. D자리 16진수 값의 목표 구간을 선택한다: S부터 E까지(양 끝 포함)이다.
  3. 16진수 자리 0부터 F까지에 대한 순열 P를, 가능한 16!개의 순열 중에서 균등 무작위로 하나 선택한다.
  4. P를 목록의 모든 수의 모든 자리에 적용해 새 목록 L'을 만든다. 형식적으로, L'의 i번째 원소의 j번째 자리는 L의 i번째 원소의 j번째 자리에 P를 적용한 결과이다.
  5. L'에서 서로 다른 두 원소를 중복 없이 고르되, 가능한 모든 쌍 중에서 균등 무작위로 하나를 선택한다. 이 선택은 순열을 고른 것과 독립적으로 이루어진다.
  6. 선택된 두 원소를 더하되, overflow 자리는 버리고(즉 16D로 모듈러 덧셈을 해서) 합을 계산한다.

마지막 단계에서 계산된 합이 S 이상 E 이하라면 hexacoin을 찾은 것이다! 예를 들어 다음과 같다고 하자.

  • L = [134, 000, FFB, 000, AA9].
  • S = 85C이고 E = EDF이다.
  • 컴퓨터가 우연히 P = (0 → 4, 1 → A, 2 → 2, 3 → 8, 4 → 9, 5 → B, 6 → C, 7 → 7, 8 → F, 9 → 1, A → 0, B → 3, C → 5, D → 6, E → E, F → D) 를 선택했다고 하자.

그러면 P를 L에 적용했을 때 얻는 L'은 [A89, 444, DD3, 444, 001]이 된다. P는 SE에는 적용하지 않는다는 점에 유의하라.

고를 수 있는 쌍은 (5 × 4) / 2 = 10개이며, 각 쌍이 선택될 확률은 1/10이다. 이 중 합이 구간 안에 들어오는 경우는 A89 + DD3 = 85C, 444 + 444 = 888, A89 + 001 = A8A, DD3 + 001 = DD4, 그리고 A89 + 444 = ECD(이 경우는 444가 두 번 있으므로 두 번 등장한다)이다.

처음 두 단계는 이미 계산되어 있고, 당신은 선택된 목록 L과 구간 [S, E]를 알고 있다. 나머지 과정이 수행된 뒤 hexacoin을 찾을 확률은 얼마인가?


入力

입력의 첫 줄에는 테스트 케이스 수 T가 주어진다. T개의 테스트 케이스가 이어진다. 각 테스트 케이스는 3줄로 이루어진다. 첫 줄에는 두 정수 ND가 주어지며, 이는 각각 주어진 목록의 크기와 사용할 자리수이다. 둘째 줄에는 D자리 16진수 수 SE가 주어지며, 이는 목표 구간의 하한과 상한(둘 다 포함)이다. 마지막 줄에는 N개의 D자리 16진수 수 L1, L2, ..., LN이 주어지며, 이는 목록의 값들이다.


出力

각 테스트 케이스마다 Case #x: y z 형식의 한 줄을 출력하라. 여기서 x는 (1부터 시작하는) 테스트 케이스 번호이고, yz는 0 이상의 정수로, 분수 y/z가 위에서 설명한 조건에서 hexacoin을 찾을 확률을 나타내야 한다. x, y, z는 모두 10진수로 출력해야 한다. 가능한 y, z가 여러 개라면 z가 최소가 되도록 선택하라.


例題

4
2 2
10 10
00 FF
2 2
10 11
00 FF
4 3
FFF FFF
230 A10 010 F70
4 3
AFF FFF
230 A10 010 F70
Case #1: 7 120
Case #2: 1 15
Case #3: 0 1
Case #4: 2731 8736
샘플 케이스 #1에서는 목표 범위가 값 10 하나뿐이다. 결과가 0으로 끝나므로 마지막 자리의 0과 F에 할당된 값의 합도 0으로 끝나야 한다. P[0]과 P[F]는 서로 다른 값이므로 합이 정확히 0일 수는 없다. 따라서 P[0] + P[F]는 (16진법에서) 10이어야 한다. 이를 만족하는 서로 다른 숫자 쌍은 7개이며, P[0]과 P[F]가 모두 8일 수는 없다. 이 7쌍은 모두 (자리올림 1을 버린 뒤) 전체 합이 10이 된다. 따라서 0과 F에 서로 다른 숫자를 할당해 헥사코인이 되는 경우는 14가지다. 가능한 할당은 16 × 15가지이므로 결과는 14/240 = 7/120이다. 샘플 케이스 #2에서는 결과가 정확히 11이 되는 확률을 샘플 케이스 #1의 결과에 더해야 한다. 그 경우는 0과 F에 0과 1을 (순서만 바꿔) 할당하는 경우뿐이다. 그 확률은 2/240 = 1/120이므로 전체 확률은 7/120 + 1/120 = 8/120 = 1/15이다. 샘플 케이스 #3에서는 컴퓨터가 목록에서 어떤 순열과 어떤 숫자 쌍을 고르더라도, 우리는 마지막 자릿수가 같은 두 수를 더하게 된다. 그러면 16^3으로 나눈 뒤에도 결과는 짝수가 된다. 범위에 있는 유일한 값은 홀수이므로 이 경우에는 헥사코인을 캘 희망이 없다. z가 최소여야 하므로 0 2는 정답의 올바른 표현이 아님을 유의하라.

出典

GCJ 2020wf C

ログインしないとコードを書けません。