Geçmiş yarışmaların sorularını çözerken Lockdown problemi dikkatimi çekti. Bicoyu ve Fakoyu aradan çıkarıp problemi çevirelim. Elimizde N ve M yüzlü iki hilesiz tane zar var. Bu zarları birlikte atıyoruz. Sonuçlarımız a ve b olsun. Bu çıkan sonuçların mutlak değerini bir s değişkeni üzerinde topluyoruz s += |a-b|.
Zarların toplamının en az K olması için beklenen zar atım sayısı nedir ?
Kısıtlar: 2<=N<=100, 2<=M<=100, K<10^9
Problemin çözümü
Beklenen değer için denklem sistemimizi yazalım.
$i=0..max(N,M)-1$
$p[i], |a-b| \text{ değerinin gelme ihtimali olsun.}$
$d[i], |a-b| \text{ değerinin kendisi olsun.}$
$$ E[0] = 0$$
$$E[n] = 1 + \sum_{i=0}^{max(N,M)-1} p[i] * E[n - d[i]]$$
Problemimiz buraya kadar çözülmüş gibi duruyor. Ancak n - d[i] ifadesinde d[i]=0 olursa sonsuz döngüye girer. Denklem sistemimizi 0 dan kurtaracak şekilde çözersek.
$$E[n] = 1 + p[0] * E[n] + p[1] * E[n-1] \cdots$$
$$E[n] - p[0] = 1 + p[1] * E[n-1] \cdots$$
$$E[n] = \frac{1 + p[1] * E[n-1] \cdots}{1-p[0]}$$
$$E[n] = \frac{ 1+\sum_{i=1} p[i] * E[n - d[i]]}{1-p[0]}$$
Bunu recurrence relation haline getirirsek
$$E[n] = \begin{cases} 0 & \text{if $n\leq0$} \\ \frac{1}{1-p[0]} & \text{if $n=1$} \\ \frac{1}{1-p[0]} + \sum_{i\neq0} \frac{p[i]}{{1-p[0]}}* E[n - d[i]] & \text{if $n>1$} \end{cases}$$
Buraya kadar olan kısmın kodunu yazalım.
|
|
Bu bize N in çok büyük olmayan değerleri için doğru sonucu verecektir. Ancak problemde K sayısı büyük olduğu için lineer yöntemlerden birini tercih edemeyiz. Kendini tekrar eden homojen lineer denklem sistemimizin n. elemanını arıyorsak matrix çarpımından faydalanabiliriz.
N = 3, M = 3 seçersek
$$ F[n] = c1 * F[n-1] + c2 * F[n-2] + k$$
şeklindeki bir recurrence ilişkinin n inci elemanı bulmak istiyorsak.
$$\begin{bmatrix} F[n] \\ F[n-1] \\ F[1] \end{bmatrix}= \begin{bmatrix} c1 & c2 & 1 \\ 1 & 0 & 0 \\ 0 & 0 & 1 \end{bmatrix}^{n-3}* \begin{bmatrix} F[3] \\ F[2] \\ F[1] \end{bmatrix}$$
Bu eşitliği kullanarak Fast Matrix Exponentiation ile $O(max(N,M)^3 log K)$ zaman karmaşıklığıyla çözümü bulabiliriz.
Inputlar değişken olmasaydı verilen değerler için generating function hesaplayarak O(1) çözüm elde edebilirdik.