乙個屋子有 n
nn 個開關控制著 n
nn 盞燈,但奇怪的是,每個開關對應的不是一盞燈,而是 n−1
n-1n−
1 盞燈,每次按下這個開關,其對應的 n−1
n-1n−
1 盞燈就會由亮變滅,或者由滅變亮。保證不會有兩個開關控制同樣的 n−1
n-1n−
1 盞燈。
現在劉同學想把燈全部開好,但是這些燈一開始的狀態非常亂,劉同學想知道最少需要按多少次開關才能使所有燈全部亮起。
單組資料輸入,每組資料一行,兩個數 n
nn,l
ll 分別代表燈的數量、最開始時亮著的燈的數量(1
<
l<
n<
10000000000
11<
l<
n<10
0000
0000
0)。每組資料輸出乙個數,即能使所有燈全部亮起的最少的按開關的次數,如果無法做到燈全部亮起,輸出「impossible
」
乙個開關控制n−1
n-1n−
1盞燈,一開始亮的燈有l
ll盞,滅的燈有n−l
n-ln−
l盞。你作為乙個操作的人,無非就是操作一盞亮的或者一盞滅的燈,你只有這兩種選擇。
亮 滅l
n−
l\begin 亮 & 滅\\ l & n-l \end
亮l滅n−
l那麼可以考慮下你的這兩種操作會帶來一種什麼樣的局面 亮滅n
−l+1
l−
1\begin 亮 & 滅\\ n-l+1 & l-1 \end
亮n−l+1
滅l−
1 亮滅n
−l−1
l+
1\begin 亮 & 滅\\ n-l-1 & l+1 \end
亮n−l−1
滅l+
1這就是你操作任一一盞燈所會帶來的局面變化。那麼考慮下最終的局面,一定是這樣的。
亮 滅n
0\begin 亮 & 滅\\ n & 0 \end
亮n滅0
那麼我們是不是可以從最終局面反推出當前局面呢?是的可以,利用每種局面亮的燈的盞數;
n −l
+1=n
n−l−
1=
n\begin n-l + 1 =n\\ n-l-1 = n \end
n−l+1=
nn−l
−1=n
解上面的兩個方程,可以把l
ll解出來,這個l
ll就是倒數第二個局面亮的燈的盞數,而且每次只有乙個方程有解,這就意味這,每次操作的燈是有明確次序的。
依次類推,可以求出從最終局面到目標局面亮的燈的盞數的乙個序列
n 1n
−23n
−4⋯1
2345
⋯\begin n & 1 & n -2 & 3 & n-4 & \cdots \\ 1 & 2 & 3 & 4 & 5 & \cdots \end
n112
n−23
34
n−45
⋯⋯
現在l
ll就在這個序列中,我們要求的問題轉換成l
ll到n
nn要經歷多少步。
可以發現,n
nn的奇偶性可以影響整個序列有無偶數。
例如,n=4
n=4n=
4 4 12
3012
34
5\begin 4 & 1 & 2 & 3 & 0 \\ 1 & 2 & 3 & 4 & 5 \end
4112
233
405n=
5n=5
n=5513
3151
2345
6\begin 5 & 1 & 3 & 3 & 1 & 5 \\ 1 & 2 & 3 & 4 & 5 & 6 \end
5112
333
415
56
通過n
nn的奇偶性,然後再考慮l
ll的奇偶性,就可以得出答案了。這在**中有體現,不再贅述。
#include
intmain()
return ret;}(
)<< std:
:endl;
}return0;
}
小公尺 oj 純位數
序號 101難度 非常難時間限制 2000ms記憶體限制 20m 描述在數學中,所謂 純位數 是指由相同位元重複而組成的自然數。比如在十進位制中,1,22,333,555 都是純位數。很顯然,15 在十進位制中不是乙個純位數,但是在二進位制 15 10 1111 2 卻是乙個純位數。乙個顯然的事實是...
小公尺OJ 119(小公尺兔跳格仔)
小公尺兔跳格仔 序號 119 難度 一般 時間限制 1000ms 記憶體限制 30m描述 公尺兔爸爸為了讓小公尺兔好好鍛鍊身體,便給小公尺兔設定了乙個挑戰 跳格仔。要吃到自己心愛的胡蘿蔔,小公尺兔需要跳過面前一些格仔。現有 n 個格仔,每個格仔內都寫上了乙個非負數,表示當前最多可以往前跳多少格,胡蘿...
小公尺OJ (136 小公尺兔的軌跡)
小公尺兔的軌跡 序號 136 難度 一般 時間限制 1000ms 記憶體限制 80m描述 有n m 的乙個矩陣,小公尺兔今天很開心,從矩陣左上角的第乙個位置開始順時針從外向裡走,很快就走遍了所有的位置,可是小公尺兔想知道自己走過的軌跡,你能告訴小公尺兔它走過的軌跡嗎?輸出乙個字串,由小公尺兔走過的位...