좋은 비트열
시간 제한2초메모리 제한1024 MB
A와 B가 주어질 때, gen_string(A, B)의 접두사 중에서 양의 정수 x, y에 대해 gen_string(x, y)와 같은 접두사의 개수를 구합니다.
문제
양의 정수 와 에 대해 함수 gen_string(a,b)는 다음 Python 코드로 정의한다.
def gen_string(a: int, b: int):
res = ""
ia, ib = 0, 0
while ia + ib < a + b:
if ia * b ≤ ib * a:
res += '0'
ia += 1
else:
res += '1'
ib += 1
return res
같은 동작을 하는 C++ 코드는 다음과 같다.
string gen_string(int64_t a, int64_t b) {
string res;
int ia = 0, ib = 0;
while (ia + ib < a + b) {
if ((__int128)ia * b ≤ (__int128)ib * a) {
res += '0';
ia++;
} else {
res += '1';
ib++;
}
}
return res;
}
루프가 끝나면 는 와 같고 는 와 같아진다. 따라서 이 함수는 길이가 이고, 0이 정확히 개, 1이 정확히 개인 비트열을 반환한다. 예를 들어 gen_string(4,10)=01110110111011이다.
비트열 에 대해 양의 정수 , 가 존재하여 = gen_string(,)이면 를 좋은 비트열이라 한다. 양의 정수 , ()가 주어지면 gen_string(,)의 좋은 접두사의 개수를 구하라.
예를 들어 gen_string(4,10)의 좋은 접두사는 6개이다.
x = 1 | y = 1 | gen_string(x, y) = 01
x = 1 | y = 2 | gen_string(x, y) = 011
x = 1 | y = 3 | gen_string(x, y) = 0111
x = 2 | y = 5 | gen_string(x, y) = 0111011
x = 3 | y = 7 | gen_string(x, y) = 0111011011
x = 4 | y = 10 | gen_string(x, y) = 01110110111011
입력
첫 줄에 테스트 케이스의 수 ()가 주어진다. 이후 개의 줄에 각각 두 정수 와 가 주어진다.
출력
각 테스트 케이스의 답을 한 줄에 하나씩 출력한다.