만드는 중입니다

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

컨볼루션

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

요약
함수 F와 G를 바탕으로 B와 C의 합집합이 A가 되는 F(B)G(C)의 합 H(A)를 구하고, 가중합을 2^32로 나눈 나머지를 출력합니다.
난이도

보통10점 중 4점

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

문제

집합 U={0,1,2,…,n−1}U = \{0, 1, 2, \dots, n-1\}의 모든 부분집합을 생각하자. 부분집합 A={a1,a2,…,ak}A = \{a_1, a_2, \dots, a_k\}마다 정수 p(A)=∑i=1k2aip(A) = \sum_{i=1}^k 2^{a_i}가 하나씩 대응한다. nn개의 원소로 이루어진 집합 위의 함수 FF는 길이가 2n2^n인 정수 배열 ff로 정해지며, F(A)=f[p(A)]F(A) = f[p(A)]이다.

두 함수 FF와 GG가 주어진다. 다음 식을 만족하는 함수 HH를 구하라.

H(A)=∑B∪C=AF(B)G(C).H(A) = \sum_{B \cup C = A} F(B)G(C).

입력

첫 줄에 두 정수 nn과 tt가 주어진다 (1≤n≤161 \le n \le 16, 1≤t≤1001 \le t \le 100). nn은 집합 UU의 크기이고, tt는 테스트 케이스의 개수이다.

둘째 줄에는 두 정수 aa와 bb가 주어진다. 둘 다 1 이상 10910^9 이하이다. 이 값은 다음 의사 난수 생성기에 쓰인다.

1. unsigned int cur = 0; // unsigned 32-bit integer
2. unsigned int nextRand16() {
3.   cur = cur * a + b; // calculated modulo 2^32
4.   return cur / 2^16; // integer from 0 to 2^16-1
5. }

테스트 케이스는 순서대로 생성된다. 각 테스트 케이스에서는 먼저 배열 ff의 원소를 인덱스가 증가하는 순서로 만들고, 같은 순서로 배열 gg의 원소를 만든다. 각 원소는 nextRand16()을 호출해 얻는다.

출력

각 테스트 케이스마다 (∑AH(A)⋅(p(A)+1)) mod 232\left(\sum_A H(A) \cdot (p(A)+1)\right) \bmod 2^{32}의 값을 한 줄에 정수 하나로 출력한다.

힌트

첫 번째 예제의 배열은 다음과 같다.

  • f1f_1: 3, 113, 3395, 36331, 41370, 61471, 9130, 11774
  • g1g_1: 25547, 45526, 55066, 13590, 14501, 41817, 9356, 18543
  • h1h_1: 76641, 8167827, 273846333, 5284992017, 1656829263, 11450721456, 3699971823, 14260048942
  • f2f_2: 32024, 43238, 51978, 52034, 53714, 38578, 43250, 52338
  • g2g_2: 62834, 50034, 59250, 8050, 44914, 36722, 53106, 20338
  • h2h_2: 2012196016, 6482475400, 8243104152, 15561662464, 7225902008, 16869349792, 22350138288, 44342816072

예제2

  1. 예제 1

    입력
    3 2
    30 239017
    
    예상 출력
    2723387430
    3167905008
    
  2. 예제 2

    입력
    16 2
    239 17
    
    예상 출력
    551267264
    1632349120