컨볼루션
시간 제한2초메모리 제한1024 MB
함수 F와 G를 바탕으로 B와 C의 합집합이 A가 되는 F(B)G(C)의 합 H(A)를 구하고, 가중합을 2^32로 나눈 나머지를 출력합니다.
문제
집합 의 모든 부분집합을 생각하자. 부분집합 마다 정수 가 하나씩 대응한다. 개의 원소로 이루어진 집합 위의 함수 는 길이가 인 정수 배열 로 정해지며, 이다.
두 함수 와 가 주어진다. 다음 식을 만족하는 함수 를 구하라.
입력
첫 줄에 두 정수 과 가 주어진다 (, ). 은 집합 의 크기이고, 는 테스트 케이스의 개수이다.
둘째 줄에는 두 정수 와 가 주어진다. 둘 다 1 이상 이하이다. 이 값은 다음 의사 난수 생성기에 쓰인다.
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. }
테스트 케이스는 순서대로 생성된다. 각 테스트 케이스에서는 먼저 배열 의 원소를 인덱스가 증가하는 순서로 만들고, 같은 순서로 배열 의 원소를 만든다. 각 원소는 nextRand16()을 호출해 얻는다.
출력
각 테스트 케이스마다 의 값을 한 줄에 정수 하나로 출력한다.
힌트
첫 번째 예제의 배열은 다음과 같다.
- : 3, 113, 3395, 36331, 41370, 61471, 9130, 11774
- : 25547, 45526, 55066, 13590, 14501, 41817, 9356, 18543
- : 76641, 8167827, 273846333, 5284992017, 1656829263, 11450721456, 3699971823, 14260048942
- : 32024, 43238, 51978, 52034, 53714, 38578, 43250, 52338
- : 62834, 50034, 59250, 8050, 44914, 36722, 53106, 20338
- : 2012196016, 6482475400, 8243104152, 15561662464, 7225902008, 16869349792, 22350138288, 44342816072