만드는 중입니다

아직 만드는 중이라 바뀔 수 있습니다

좋은 비트열

시간 제한2초메모리 제한1024 MB

요약
A와 B가 주어질 때, gen_string(A, B)의 접두사 중에서 양의 정수 x, y에 대해 gen_string(x, y)와 같은 접두사의 개수를 구합니다.
난이도

어려움10점 중 8점

유형
정수론, 수학, 분할 정복
정답자
아직 제출이 없습니다

문제

양의 정수 aa와 bb에 대해 함수 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;
}

루프가 끝나면 iaia는 aa와 같고 ibib는 bb와 같아진다. 따라서 이 함수는 길이가 a+ba+b이고, 0이 정확히 aa개, 1이 정확히 bb개인 비트열을 반환한다. 예를 들어 gen_string(4,10)=01110110111011이다.

비트열 ss에 대해 양의 정수 xx, yy가 존재하여 ss = gen_string(xx,yy)이면 ss를 좋은 비트열이라 한다. 양의 정수 AA, BB (1≤A,B≤10181 \le A, B \le 10^{18})가 주어지면 gen_string(AA,BB)의 좋은 접두사의 개수를 구하라.

예를 들어 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

입력

첫 줄에 테스트 케이스의 수 TT (1≤T≤101 \le T \le 10)가 주어진다. 이후 TT개의 줄에 각각 두 정수 AA와 BB가 주어진다.

출력

각 테스트 케이스의 답을 한 줄에 하나씩 출력한다.

예제1

  1. 예제 1

    입력
    6
    1 1
    3 5
    4 7
    8 20
    4 10
    27 21
    
    예상 출력
    1
    5
    7
    10
    6
    13