Ở lớp 10 chuyên Tin, Nhật và Vy tuy là đôi bạn thân nhưng trong chuyện học hành lại cạnh tranh nhau rất khốc liệt. Một hôm, thầy Hùng khen ngợi rằng Vy có khả năng tính nhẩm tốt hơn Nhật làm cậu bạn vô cùng ấm ức và ghen tức. Nhật không chấp nhận thực tế này nên đã mời hai đàn anh, đàn chị là Công Huân và Ly Na đứng ra làm giám khảo cho một cuộc tỉ thí công khai về trình độ tính nhẩm giữa cậu ấy và Vy. Huân và Na quyết định chọn dãy số Catalan nổi tiếng làm đề bài cho cuộc so tài: Số Catalan thứ n được định nghĩa là \(C_n\)= \(\frac{1}{n+1}\)\((_{2n}^{n})\)= \(\frac{(2n)!}{(n+1)!n!}\) và hai bạn thí sinh cần kiểm tra xem với mỗi cặp số nguyên không âm \(m\) và \(K\) thì \(K\) có bằng với \(C_m\) hay không, ai trả lời chính xác và nhanh nhất sẽ giành chiến thắng. Nhật muốn thắng cuộc tỉ thí bằng mọi giá nên đã nhờ các bạn lập trình tính toán giúp câu trả lời. Hãy giúp cậu ấy đạt được thắng lợi nhé!
Input
-
Dòng đầu chứa số nguyên dương \(T \leq 100\) là số lượng câu hỏi.
-
\(T\) dòng sau, mỗi dòng chứa hai số nguyên không âm \(m\) và \(K\) thể hiện một câu hỏi từ Huân và \(Na\).
Output
- Gồm \(T\) dòng, mỗi dòng in ra YES nếu \(K=C_m\) với \(m\), \(K\) tương ứng, hoặc in ra NO trong trường hợp ngược lại.
Scoring
- Subtask \(1\) (\(30\%\) số điểm): \(m \leq 10\), \(K \leq 20,000\).
- Subtask \(2\) (\(30\%\) số điểm): \(m \leq 5000\), \(K\) có không quá \(5000\) chữ số.
- Subtask \(3\) (\(40\%\) số điểm): \(m \leq 50,000\), \(K\) có không quá \(50,000\) chữ số.
Example
Test 1
Input
5
0 1
1 1
3 5
5 42
6 130
Output
YES
YES
YES
YES
NO
Bình luận
Spoiler Alert
Hint 1
bignum
sẽTLE
đấy 😢 tin tui đi, hướng này không tiếp cận được đâuHint 2
Hash
, xâu kí tự sẽ giảm đi thành giá trị \(x \in [0, modulo)\)Hint 3
Hint 4
Hint 5
Modular Inverse
để tính \(\frac{1}{a} (mod\) \(m)\)Hint 6
Hash
cần cẩn thận: \(A = B \Rightarrow f(A) = f(B)\) không phải là mũi tên hai chiềuHint 7
Hint 8
Reference AC code | \(O(n)\) time + \(O(q)\) \(\times\) \(O(log_{10}K)\) query | \(O(n)\) auxiliary space | Online Solving, Precalculation, Query-problem, Hashing, Modular Inverse, Math, String
Có thể bổ sung thêm một ý nhỏ. Giả sử ta chọn hash với một số nguyên tố \(p\) nào đó, thì xác suất sai là \(\frac{1}{p}\) vì mỗi giá trị nhận được nằm trong đoạn \([0, p-1]\). Nếu \(p\) tầm \(10^9\), thì xác suất sai sẽ là \(10^{-9}\), đủ nhỏ để AC trên các test ngẫu nhiên, trừ khi người ra đề cố tình sinh test để diệt các mod quen thuộc như \(10^9+7\). Và nếu chúng ta chọn \(10\) số nguyên tố như trên thì xác suất sai sẽ tầm \((10^{-9})^{10} = 10^{-90}\), tuy nhiên đổi lại thuật toán sẽ chạy chậm hơn \(10\) lần.
Vì vậy đối với các bạn hash như này, tầm \(1-3\) số nguyên tố là đủ để các bạn tự tin AC (còn nếu WA thì rất có thể thuật có sai sót). Các bạn cũng nên cẩn thận với các số nguyên tố quen thuộc như \(10^9+7\) hay \(10^9+9\) vì rất có thể người ra đề sẽ cố tình sinh test để diệt.
p/s: CaiWinDao có tâm nên không sinh test diệt bài này :v