중복 없는 숫자 세기
시간 제한2초메모리 제한1024 MB
십진법 또는 십육진법에서 주어진 구간에 있는 서로 다른 숫자로 이루어진 수의 개수를 세거나, i번째 그러한 수를 찾는다.
문제
어떤 수의 자릿수가 모두 다르면 그 수를 솔로 넘버라고 한다. 예를 들어 10진법에서 123은 솔로 넘버이고, 16진법에서 9af도 솔로 넘버이다. 10진법의 101과 16진법의 aba는 같은 숫자가 두 번 나오므로 솔로 넘버가 아니다.
이 문제에서는 두 가지 종류의 질문이 주어진다. 하나는 10진법이나 16진법으로 주어진 구간 [a, b]에서 a와 b를 포함한 솔로 넘버의 개수를 구하는 것이다. 다른 하나는 어떤 수 i가 주어졌을 때 그 진법에서 i번째 솔로 넘버를 찾는 것이다.
입력
첫 줄에 테스트 케이스의 수 n이 주어진다. 각 테스트 케이스는 질문 하나이며 한 줄로 주어진다.
각 질문은 문자 'd' 또는 'h'로 시작하는데, 각각 10진법 영역과 16진법 영역을 나타낸다. 10진법 영역에서는 뒤따르는 수가 모두 10진법으로 주어지고, 16진법 영역에서는 뒤따르는 수가 모두 16진법으로 주어진다.
첫 문자 다음에는 질문의 종류를 나타내는 숫자 0 또는 1이 온다. 종류 0 질문에서는 구간을 나타내는 두 정수 a, b (0 ≤ a ≤ b < 2^64)가 주어진다. 종류 1 질문에서는 순서를 나타내는 정수 i (1 ≤ i < 2^64)가 주어진다.
출력
각 질문에 대해 해당 테스트 케이스의 답을 한 줄에 출력한다. 10진법 영역의 질문에는 답을 10진법으로 출력하고, 16진법 영역의 질문에는 답을 16진법으로 출력한다.
종류 1 질문에서 i번째 솔로 넘버가 존재하지 않으면 해당 줄에 '-' 하나를 출력한다.
제한
- 1 ≤ n ≤ 50000.
- 0 ≤ a ≤ b < 2^64.
- 1 ≤ i < 2^64.