어떤 양의 정수 에 대해 길이가 인 비트문자열 가 있다. 의 비트들은 왼쪽부터 순서대로 번부터 번까지 번호가 붙어 있다. 처음에 의 모든 비트는 이다.
다음과 같은 함수 가 있다. 이때, 는 길이가 꼴인 비트문자열이다.
- 의 길이가 인 경우, 아무 작업 없이 종료한다.
- 를 절반으로 나눈다. 왼쪽 절반을 , 오른쪽 절반을 이라고 하자.
- 왼쪽 절반 의 비트를 뒤집는다.
- 을 재귀호출 한다.
- 을 재귀호출 한다.
여기서, 비트를 뒤집는다는 것은 은 로 만들고, 은 으로 만든다는 것을 의미한다.
모든 비트가 인 길이가 인 비트문자열 에서 를 호출한 이후 비트문자열 를 라고 하자.
인 경우, 초기 비트문자열은 이다. 위 작업의 결과로 최종 비트문자열은 이 된다. (왼쪽 절반인 이 로 바뀌었다.)
인 경우, 초기 비트문자열은 이다. 위 작업에서 첫 번째 호출이 비트문자열을 으로 바꾼다. 첫 번째 호출에서 4번 과정의 재귀호출을 하면 비트문자열이 으로 바뀌고, 5번 과정의 재귀호출을 하면 비트문자열은 으로 바뀌므로, 최종 비트문자열은 이 된다.
인 경우, 이와 마찬가지로 최종 비트문자열은 이 된다.
정리하면 다음과 같다.
양의 정수 , , 를 입력으로 받아, 의 번 비트부터 번 비트까지 의 개수를 구하는 프로그램을 작성하시오.
입력 형식
첫 줄에 테스트 케이스의 수를 나타내는 정수 가 주어진다. ()
각 테스트 케이스의 첫 줄에 양의 정수 , , 이 공백으로 구분되어 주어진다. ( )
출력 형식
각 테스트 케이스에 대해, 의 번 비트부터 번 비트까지 의 개수를 각 줄에 출력한다.
예제
입력
3 2 2 4 3 1 6 4 3 6
출력
2 3 2
채점 방식
입력 케이스들은 다음과 같은 종류로 구별되며, 한 종류의 케이스를 다 맞혀야 그 종류에 배정된 점수를 받을 수 있다.
종류 1: 11점
종류 2: 12점
종류 3: 24점
종류 4: 16점
종류 5: 18점
종류 6: 19점
추가적인 제한 조건이 없음.
해설
하나의 입력에 만 개의 테스트 케이스가 있을 수 있으므로, 각 테스트 케이스에 대한 답을 빠르게 구해야 합니다. 에 여러 특징이 있는데 그중 하나로 번째 문자와 번째 문자가 서로 다르다는 점입니다. 이 점을 이용하면 구간 에서 번째 문자와 번째 문자를 알면 과 의 개수를 셀 수 있습니다.
의 번째 문자를 구하는 방법은 다음과 같습니다.
- 이라면, 의 번째 문자를 구합니다.
- 그렇지 않다면, 의
x번째 문자를 구하고 뒤집습니다.
만약 가 엄청나게 크다면 의 번째 문자를 구하고 의 홀짝성에 따라 그것을 뒤집으면 됩니다.
각 테스트 케이스마다 시간복잡도는 가 됩니다.