페이지를 불러오는 중…
해결한 사람
1
명
정답률
50.00
%
시간 제한
2000
ms
메모리 제한
2048
MB
개의 게이트로 구성된 회로가 있다. 게이트들은 부터 까지 번호가 붙어 있다. 게이트 부터 까지는 임계 게이트들이고, 게이트 부터 까지는 소스 게이트들이다.
게이트 을 제외한 각 게이트의 출력은 하나이고 정확히 하나의 임계 게이트의 입력으로 연결된다. 좀 더 구체적으로 각 게이트 의 () 출력은 게이트 의 입력이다 (). 중요하게 가 항상 성립한다. 또 이다. 즉, 게이트 의 출력은 다른 어떤 게이트의 입력으로도 연결되지 않는다. 모든 임계 게이트는 하나 이상의 입력을 가진다. 모든 소스 게이트는 입력이 없다.
각 게이트는 혹은 의 값이 될 수 있는 상태를 가진다. 게이트의 출력은 그 게이트의 상태와 같다. 소스 게이트들의 상태는 입력 배열 (배열 크기 )로 주어진다. 즉, 각 에 대해 (), 의 값이 게이트 의 상태이다.
각 임계 게이트의 상태는 해당 게이트의 입력에 따라 다음과 같이 결정된다. 각 임계 게이트에는 임계치를 결정하는 파라미터가 정해져 있다. 개의 입력을 가진 임계 게이트의 파라미터는 이상 이하의 정수이다. 파라미터가 인 임계 게이트의 상태는 입력 중 개 이상이 인 경우 이고, 그렇지 않은 경우 이다.
예를 들어 개의 임계 게이트와 개의 소스 게이트가 있는 회로가 있다고 하자. 게이트 의 입력은 게이트 과 의 출력이고, 게이트 의 입력은 게이트 , , 이며, 게이트 의 입력은 게이트 이다.
이 회로는 아래 그림에 표시되어 있다.

이 회로에서 게이트 과 의 상태는 이고 게이트 와 의 상태는 이라고 하자. 게이트 , , 의 파라미터는 각각 , , 라고 하자. 이 경우 게이트 의 상태는 , 게이트 의 상태는 , 게이트 의 상태는 이 된다. 위의 파라미터 값과 상태는 아래 그림에 표시되어 있다. 게이트의 상태가 인 것들이 검은색으로 표시되어 있다.

소스 게이트들의 상태는 번 업데이트된다. 각 업데이트는 두 정수 , 로 () 표현된다. 업데이트의 의미는 번호가 부터 까지인 모든 소스 게이트의 상태를 뒤집는 것이다. 즉, 각 ()에 대해 소스 게이트 의 상태가 이면 로, 이면 으로 바뀐다. 업데이트에 의해 변경된 게이트들의 상태는 이후의 업데이트에 영향을 받지 않는 한 유지된다.
초기 상태를 입력받고 각 업데이트 이후에 게이트 의 상태가 이 되도록 만들 수 있는 임계 게이트 파라미터 설정 방법의 경우의 수를 계산하는 프로그램을 작성하라. 두 파라미터 설정 방법이 다르다는 것은 임계 게이트 중 하나라도 다른 파라미터 값을 가진다는 것으로 정의된다. 경우의 수 값이 매우 클 수 있으므로 그 값을 로 나눈 나머지를 결과로 제시해야 한다.
위의 예에서 게이트 , , 는 각각 , , 개의 입력이 있으므로 가능한 파라미터 설정 방법은 가지가 있다. 가능한 방법들 중 가지에서 게이트 의 상태는 이 된다.
다음 개의 함수를 구현해야 한다.
void init(int N, int M, int[] P, int[] A)
count_ways 호출 이전에 정확히 한 번 호출된다.int count_ways(int L, int R)
다음 호출들을 보자.
init(3, 4, [-1, 0, 1, 2, 1, 1, 0], [1, 0, 1, 0])
이 회로는 본문에서 설명한 것과 같다.
count_ways(3, 4)
게이트 과 를 뒤집는다. 즉, 게이트 의 상태는 이 되고 게이트 의 상태는 이 된다. 게이트 의 상태가 이 되게 하는 가지 파라미터 설정이 아래 그림에 표현되어 있다.
| 설정 | 설정 |
|---|---|
![]() | ![]() |
위의 방법 이외의 모든 다른 설정에서 게이트 의 상태가 이 된다. 따라서 이 함수 호출은 를 리턴해야 한다.
count_ways(4, 5)
게이트 와 를 뒤집는다. 모든 소스 게이트의 상태가 이 되었다. 이 경우 파라미터 설정을 어떻게 해도 게이트 의 상태는 이다. 따라서 이 함수 호출은 을 리턴해야 한다.
count_ways(3, 6)
모든 소스 게이트의 상태가 로 바뀐다. 이 경우 파라미터 설정을 어떻게 해도 게이트 의 상태는 이다. 따라서 이 함수 호출은 을 리턴해야 한다.
샘플 그레이더는 다음의 출력을 생성한다.
count_ways의 리턴 값3 4 3
-1 0 1 2 1 1 0
1 0 1 0
3 4
4 5
3 6
2
0
6
샘플 그레이더는 다음의 양식으로 입력을 받는다.
International Olympiad in Informatics (IOI) 2022, official task package and official Korean statement.
Reporch에서 한국어 번역, 수식 표기, 이미지 호스팅 및 형식을 수정했습니다.
로그인 상태를 확인하는 중입니다.