1. 程式人生 > >暑假NOIP期末考試【1】—— Phantom

暑假NOIP期末考試【1】—— Phantom

ade 快的 while num eas for 靈感 搜索 時間復雜度

Phantom

?題目名稱: phantom
?時間限制:1 秒
?空間限制:256 MiB

題目描寫敘述

在一個無限大的棋盤上。排列著 n * n 枚棋子,形成一個 n 行 n 列的方陣。棋子能夠橫向或者縱向移動,移動方式是越過一個相鄰的棋子,落入同一方向上的下一個空暇的格子裏,同一時候。移除被越過的棋子。

如今。我們想知道,是否有可能通過若幹次操作。使得棋盤上僅剩一枚棋子。
比如。當 n = 2 時,有例如以下操作方法:
…. …. …. ….
.OO. => …O => …O => ….
.OO. .OO. …O ….
…. …. …. …O

輸入格式

輸入文件的第一行包括一個整數,表示測試數據的數目。
每一個測試數據占一行,包括單獨的一個整數 n。

輸出格式

對於每一個測試數據。在單獨的一行內輸出答案。


假設有可能使得棋盤上僅剩一枚棋子,輸出 YES ;否則輸出 NO 。

例子輸入2

2
3

例子輸出YES

NO

數據範圍與約定

?對於 30% 的數據,n ≤ 6。


?對於 100% 的數據,n ≤ 1 000 000 000,測試數據不超過 1000 組。


對於這道題非常多人最初的感覺就是搜索嘛,只是看看這大數據,n<=1 000 000 000,怎麽可能。

僅僅能是O(1)的時間復雜度啊。所以。直覺告訴我。或者說是個人都會知道,這道題是一道有規律可循的題。。

All jokes aside,先說一下老師介紹的第一種方法:

對於一個N=2的4*4矩陣來說。我們非常easy的就能把它變成我們想要的情況,那麽是不是能夠把它作為一個基本模型,或者說讓它成為我們的期望裝態,這樣的思想相似於數學中的“歸納法”(這一點能夠好好體會一下)。


經過以上的分析後,如今我們能夠動手實踐一下了。

有句話叫什麽來著“失敗是通往成功的必經之路”,所以你會發現,當N=3的時候,怎麽也不能實現。當時當你畫4*4的情況的時候。或許在某種情況會出現一個完整的2*2。而這正是你想要的。
技術分享
而我們知道僅僅剩下一個點當然也是能夠的。所以同理,當N=5的時候就會出現以下的情況:
技術分享


這時候大概就會找到一些規律了,也就是我們都是每三個三個消掉的。似乎僅僅要有三個連續的就能夠弄掉,只是其實並不是這樣簡單,條件是得出現一個‘L’形狀,也就是說這三個點的兩端的兩邊至少要有一個點。這樣這三個點才幹夠消掉。

並且我們舉得4,5這兩個例子大能夠概括全部的情況(事實證明。不要問我為什麽,自己試試就知道了)。
技術分享
就像這個樣子,對於隨意的N(也並不是隨意),都能夠轉化為4或5的形式。進而轉化到我們的基本模型,1或2。


但到這裏。可能你還會有些疑問,或許你還在問為什麽為什麽,由於我們越過了一個非常奇妙的數字,3。
由於。假設依照之前的思想,那麽三是不是應該就沒了?——只是這當然是不可能的啊,為什麽呢?再花哨的語言也說不清事物的本質,因此這樣的問題還是須要自己實踐一下,這樣自然會明確。


這回能夠擴展到隨意的N了,對於一個(N^2)不能被3整除的數,我們都會處理。而能被3整除的數終於不能化成1或2,所以不能夠。

Ex——方法2

之前就說過,異或是一個非常奇妙的東西。在計算機中。異或屬於位運算的一種。並且利用二進制能夠非常快的計算出來。

只是我們在這道題用的並不是這個性質,而是以下的這三種關系:

1^2=3
2^3=1
3^1=2

也就是說,1,2,3的異或是互相轉換的。
這樣,我們能夠把每一個格子標號
以N=6為例

1 2 3 1 2 3
3 1 2 3 1 2
2 3 1 2 3 1
1 2 3 1 2 3
3 1 2 3 1 2
2 3 1 2 3 1
無論你在這個矩陣中找到了什麽規律。我想告訴你的是。每一個點的上下左右都是兩個不同的數字,這樣有什麽優點呢?想想看。我們終於的狀態是什麽?1或者2或者3對吧,而我們知道如今的總亦或值為0。所以無論我們如何移動都不能出現單獨的一個數字。

而這個結論正好與第一個方法中的能被3整除相調和。


PS:異或的性質非常重要,理解深刻的話對於做題來講十分實用,假設一道題你能想出來能夠用如異或一樣的位運算方法的時候,你就是神犇。

最形象的方法——方法3

用最本質的想法, OO* —>**O 是我們移動的根本,那麽是否我們能夠抽象出一個模型(以5為例):
技術分享
為什麽這樣做呢?能夠看到。當我每次移動一步的時候,每一個顏色的點都會相應的添加一個或者降低一個。假設這個能夠理解的話。那麽我說它們的奇偶性都會隨之改變。且同一時候變為相反的狀態,依照上圖:
BLUE: 8
BLACK: 8
WHILE:9
也就是”偶偶奇“,而我們的目的狀態就是”001“—>‘偶偶奇’。

非常顯然僅僅要我的黑、藍、白三個數目不相等就好。這樣就非常easy理解為什麽能被3整除就不行了,由於在3*3的格子中,黑藍白三種顏色的數目始終是相等的。因此這樣的方法就非常好地攻克了我們方法1中可能存在疑惑的地方。

所以就非常好理解了為什麽N%3==0就能夠,else 不行。


Code:
太簡單了,就不貼了。

Summary:

做題前一定要看看數據範圍。往往數據範圍就能提示你改用什麽算法來作答,同一時候思想不能死板,不要往模板題上想,靈感可能就在電光火石間產生。

暑假NOIP期末考試【1】—— Phantom