לכל שני מספרים שלמים חיוביים $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