Petya 是一個很喜歡計算機的人。他平時喜歡買各種不同功能的計算機,順便研究各類計算機的功能。
有一天,Petya 買到了一種特殊的計算機。這種計算機是主要提供寫程式的人使用,因此除了支援平常常見的四則運算之外,還可以做 AND、OR、NOT、XOR、位元左右移等常見的位元運算。另外一個特殊的功能是這款計算機有簡易的儲存和巨集(macro)功能:使用者如果需要做大量重複的計算,可以把常用的運算流程事先儲存成一個巨集,這樣之後在輸入資料之後,只需要按一個鍵,計算機就能執行事先儲存好的運算流程並馬上給出結果。
具體來說,這個計算機有 8 個記憶區(編號為 0 到 7),每個記憶區可以儲存一個介於
Petya 非常喜歡玩這個計算機的巨集功能。他尤其喜歡先儲存一個巨集,然後不斷的重複按「執行巨集」鍵,看記憶區的數字是如何快速變化的。然而他發現一次又一次地按「執行巨集」鍵實在是太累了,而且還很傷手。因此,Petya 找到了你,希望你可以幫他寫一個模擬這種計算機的程式,讓他可以知道在連續按了
另外,Petya 會給你一部份他寫的巨集供你參考,這些巨集也會出現在測資當中。不過 Petya 不希望你的程式只能套用在他目前寫出來的巨集,因此多數測資中的巨集 Petya 不會讓你知道。然而,這些沒有讓你知道的巨集中,有些可能會與 Petya 給你的巨集有一些相似的特性,所以你如果針對 Petya 給你的巨集中的一些特性做優化的話,很可能可以得到更多的分數。
本題沒有輸入,如果你輸入了任何東西,可能會導致各種不可預期的結果。
請#include "lib2295.h"
之後實作下列兩個函數。
void init_macro(int N, const uint32_t op[][5]);
:評測程式在執行的一開始會先呼叫這個函數,代表 Petya 儲存的巨集的內容。在一次執行當中,這個函數只會被呼叫一次,且保證 op
陣列在之後每次呼叫 run_macro
時仍然可以存取。
傳入的參數中,N
即是巨集的步驟數量,而 op
則是一個
>>
)
<<
)
~
)
輸入必定滿足:
void run_macro(int T, uint32_t memory[8]);
:這個函數代表 Petya 想執行巨集。傳入的參數中,T
代表 Petya 希望巨集連續執行的次數,memory
則是 8 個記憶區在一開始儲存的數字。這個函數必須將 Petya 儲存的巨集執行 memory
陣列中。
對於所有測資:
run_macro
的次數不超過 run_macro
的 對於 100 分的測資,所有呼叫的 run_macro
的
本題沒有輸出,如果你輸出了任何東西,你將會獲得一個WA。
Petya 提供給你的巨集可以在這裡下載,對應的測資各筆測資的敘述。每個檔案中第一行是 op
陣列的內容。這個巨集的格式是為了方便測試標頭檔使用,如果想要更容易閱讀的話,可以使用這個 Python script 將巨集轉換成易懂的格式。請注意這個 script 雖然是以 C/C++ 的運算子符號輸出,但實際的操作須以題目敘述為準,因此可能與 C/C++ 中對應的操作不同(例如一行 3 1 0 1 0
的操作會輸出成 m0 := m1 / 0
)。
對於所有測資,若你的程式執行時間為時限的
你只需要知道
這裡有一個測試用的標頭檔,可以用來測試。
該標頭檔接受以下輸入,數字間皆以空白分隔:
第一行:
接下來
(此格式與 Petya 給的巨集格式相同。)
下一行有一個數字 run_macro
的總次數。
接下來 memory[0]
,memory[1]
, memory[7]
,意義如題目所示。
程式會對每次呼叫 run_macro
輸出一行包含八個數字,代表執行完 run_macro
後 memory
陣列的內容。
TIOJ 終極壓常數大賽 pD
No. | Testdata Range | Constraints | Score |
---|---|---|---|
1 | 0 | 50 | |
2 | 1 | 50 | |
3 | 2 | macro_01.txt ; |
8 |
4 | 3 | macro_02.txt ; |
8 |
5 | 4 | macro_03.txt ; |
8 |
6 | 5 | macro_04.txt ; |
8 |
7 | 6 | macro_05.txt ; |
5 |
8 | 7 | macro_06.txt ; |
5 |
9 | 8 | macro_07.txt ; |
5 |
10 | 9 | 40 | |
11 | 10 | 20 | |
12 | 11 | 40 | |
13 | 12 | 15 | |
14 | 13 | 15 | |
15 | 14 | 20 | |
16 | 15 | 20 | |
17 | 16 | 25 | |
18 | 17 | 12 | |
19 | 18 | 12 | |
20 | 19 | 20 | |
21 | 20 | 25 | |
22 | 21 | 80 | |
23 | 22 | 50 | |
24 | 23 | 80 | |
25 | 24 | 50 | |
26 | 25 | 40 | |
27 | 26 | 10 | |
28 | 27 | 30 |