Under construction

Still being built. Things may change

Good Bitstrings

Time limit2sMemory limit1024 MB

Summary
Given A and B, count the prefixes of gen_string(A, B) that also equal gen_string(x, y) for some positive integers x and y.
Level

Hard8 of 10

Topics
Number theory, Math, Divide and conquer
Solved
No attempts yet

Statement

For positive integers aa and bb, the function gen_string(a,b) is defined by the following Python code.

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

The equivalent C++ code is below.

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;
}

When the loop ends, iaia equals aa and ibib equals bb. So the function returns a bitstring of length a+ba+b with exactly aa zeroes and bb ones. For example, gen_string(4,10)=01110110111011.

Call a bitstring ss good if there exist positive integers xx and yy such that ss = gen_string(xx,yy). Given positive integers AA and BB (1≤A,B≤10181 \le A, B \le 10^{18}), count the good prefixes of gen_string(AA,BB).

For example, gen_string(4,10) has 6 good prefixes:

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

Input

The first line contains TT (1≤T≤101 \le T \le 10), the number of test cases. Each of the next TT lines contains two integers AA and BB.

Output

For each test case, print the answer on a new line.

Examples1

  1. Example 1

    Input
    6
    1 1
    3 5
    4 7
    8 20
    4 10
    27 21
    
    Expected output
    1
    5
    7
    10
    6
    13