LuoguP7441 「EZEC-7」Erinnerung 題解
Content
給定 \(x,y,K\)。定義兩個數列 \(c,e\),其中 \(c_i=\begin{cases}x\cdot i&x\cdot i\leqslant K\\-K&\text{otherwise}\end{cases}\),\(e_i=\begin{cases}y\cdot i&y\cdot i\leqslant K\\-K&\text{otherwise}\end{cases}\)。每次操作從兩個數列中各選取一個數,滿足兩個數之和 \(\geqslant K\)。一個數選取了之後不能再重複取。問你一共能進行多少次操作。
資料範圍:\(t\) 組資料,\(1\leqslant t\leqslant 10^5\)
Solution
不難發現,如果 \(x,y\neq0\),那麼答案必定是 \(\min\{\left\lfloor\dfrac Kx\right\rfloor,\left\lfloor\dfrac Ky\right\rfloor\}\)。
證明:
(1) \(y\geqslant x\),則對於 \((c_n,e_1)\) 這一對數(\(n\) 表示能夠使 \(c_i\geqslant 0\) 成立的最大的 \(i\)),因為 \(c_n+x\geqslant K\)
(2)\(y\leqslant x\),則對於 \((c_1,e_m)\) 這兩對 (\(m\) 含義類比於上面的 \(n\)),因為 \(e_m+y\geqslant K\),而 \(x\geqslant y\),所以必然有 \(c_1+e_m=e_m+x\geqslant K\)。後面的 \((c_2,e_{m-1}),\dots\) 也顯然成立。
證明完之後我們再來看看 \(x,y\) 中至少有一個等於 \(0\)
(1)\(x,y\) 中有且僅有一個等於 \(0\)。則我們需要看是否有 \(\max\{x,y\}\mid K\),如果有的話,那我們可以拿一個 \(K\) 和 \(0\) 組成一對,這對數的和恰好等於 \(K\),此時答案為 \(1\);否則,答案為 \(0\)。
(2)\(x,y\) 都等於 \(0\),顯然,由於 \(K\geqslant 1\),且無法選出一對數使得它們的和為正整數,所以答案為 \(0\)。
分類討論完這些情況後,程式碼就不難打了。
Code
int main() {
MT {
ll x = Rll, y = Rll, k = Rll;
if(!x && y && !(k % y)) puts("1");
else if(!y && x && !(k % x)) puts("1");
else write(min((!x ? 0 : k / x), (!y ? 0 : k / y))), puts("");
}
return 0;
}