Для любых двух положительных целых чисел $a$ и $b$ определим функцию $\texttt{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;
}
Когда цикл завершается, $ia$ равно $a$, а $ib$ равно $b$, поэтому функция возвращает битовую строку длины $a+b$, содержащую ровно $a$ нулей и $b$ единиц. Например, $\texttt{gen_string}(4,10)=01110110111011$.
Назовём битовую строку $s$ хорошей, если существуют положительные целые числа $x$ и $y$, такие что $s=\texttt{gen_string}(x,y)$. Даны два положительных целых числа $A$ и $B$ ($1\le A,B\le 10^{18}$). Ваша задача — вычислить количество хороших префиксов строки $\texttt{gen_string}(A,B)$. Например, у $\texttt{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
Входные данные
Первая строка содержит $T$ ($1\le T\le 10$), количество независимых тестовых случаев.
Каждая из следующих $T$ строк содержит два целых числа $A$ и $B$.
Выходные данные
Выведите ответ для каждого тестового случая на отдельной строке.
Примеры
Входные данные 1
6 1 1 3 5 4 7 8 20 4 10 27 21
Выходные данные 1
1 5 7 10 6 13
Подзадачи
- Вход 2: $A,B\le 100$
- Вход 3: $A,B\le 1000$
- Входы 4–7: $A,B\le 10^6$
- Входы 8–13: Все ответы не превосходят $10^5$.
- Входы 14–21: Нет дополнительных ограничений.
Автор задачи: Benjamin Qi