1. 程式人生 > 其它 >[NOI Online 2022 普及組] 數學遊戲 - 題解

[NOI Online 2022 普及組] 數學遊戲 - 題解

場外選手口胡題解

題目大意

  • \(t\) 組資料,每組資料給定 \(x, z\),構造最小的 \(y\) 使得 \(z = x \times y \times \gcd(x, y)\),無解則輸出 \(-1\)
  • \(1 \leq t \leq 5 \times 10^5\)\(1 \leq x \leq 10^9\)\(1 \leq z < 2^{63}\)

解題思路

首先判無解。容易發現如果 \(z\) 不是 \(x\) 的倍數顯然無解。

接下來我們將題目中所給的式子做第一步化簡:

\[y \times \gcd(x, y) = \frac zx \]

我們發現 \(\gcd(x, y)\)

不太方便化簡,那就把它設出來吧。

不妨設 \(\gcd(x, y) = k\)\(x = k \times n\)\(y = k \times m\),我們有

\[(k \times m) \times k = k^2 \times m = \frac zx \]

所以 \(k^2 \mid \frac zx\)

考慮到 \(x = k \times n\),我們易得 \(k^2 \mid x^2\)

\(\therefore k^2 \mid \gcd(x^2, \frac zx)\)

似乎有些進展不下去了。那我們來大膽的猜測:有沒有可能這個 \(\gcd(x^2, \frac zx)\)

就恰好等於 \(k^2\) 呢?

推柿子,可以得到

\[\gcd(x^2, \frac zx) = \gcd((k \times n)^2, k \times y) = \gcd(k^2 \times n^2, k^2 \times m) = \gcd(n^2, m) \times k \]

注意到 \(n, m\) 互質,所以 \(k^2 = \gcd(x^2, \frac zx)\),我們可以愉快地求出 \(k\) 啦!

當然,我們需要判斷一下,如果 \(\gcd(x^2, \frac zx)\) 不是完全平方數則無解。

再次觀察我們最初得到的式子,\(y \times \gcd(x, y) = \frac zx\)

既然我們已經知道了 \(\frac zx\),知道了 \(k\) 也就是 \(\gcd(x, y)\),那麼問題也迎刃而解了,

\[y = \frac zx \div \gcd(x, y) = \frac zx \div \sqrt{\gcd(x^2, \frac zx)} \]

單次詢問時間複雜度 \(O(1)\)


程式碼

資料還沒出,程式碼先咕了