1. 程式人生 > 其它 >LuoguP7441 「EZEC-7」Erinnerung 題解

LuoguP7441 「EZEC-7」Erinnerung 題解

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\)

\(0\leqslant x,y\leqslant 10^{10}\)\(1\leqslant K\leqslant 10^{10}\)

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\)

,而 \(y\geqslant x\),所以必然有 \(c_n+e_1=c_n+y\geqslant K\)。後面的 \((c_{n-1},e_2),\dots\) 也顯然成立。

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