本題限用 C++ 作答。
「 這題根本就是計結阿!」── 聽完這題的雞塊
雞塊是個人體超級計算機,有一天他看到了網站上有人在號召一個活動:「跨年一起算數學」,於是他二話不說直接按下有興趣參加了。到了活動現場,他看見許多人拿著一堆算盤走來走去。
每一個算盤都有恰
註:這種二進位編碼概念和 C++ 的 int
型別類似。
雞塊現在有
store(std::string s, int t)
,將 storebit(int x, int b, int t, int d)
,將 prop(int x, int b, int t)
, 將 flip(int x, int t)
,將 left(int x, int p, int t)
,將 right(int x, int p, int t)
,將 compare(int x, int y, int cmp, int t)
,比較 cmp
做為比較函式。cmp
可以是 OP_LESS
、 OP_LEQ
、 OP_GREATER
或 OP_GEQ
,分別代表 calculate(int x, int y, int op, int t)
,將 op
op
可以是 OP_AND
、OP_OR
、 OP_XOR
、OP_ADD
、OP_SUBTRACT
,分別代表位元 AND、位元 OR、位元 XOR、數字加法以及數字減法五種操作。對於上述所有操作,都須符合
雞塊希望可以用這些運算來解決一些計算問題,而他也想要對於一種計算問題找到固定的步驟使得按照這組步驟做可以解決任何一個範圍內的問題。請你使用上面的操作來完成下列四種問題(每個問題是一個子題)。
題目給定的 void answer(int x)
來回答算盤編號。
本題沒有輸入,請引入 lib0046.h
,並且實作函式 void solve(int problem_type)
。problem_type
會是一個
請下載 abacus.zip,裡面會有一些檔案。
檔案的意義分別為:
abacus.cpp
:這是你要寫的程式,並且最後繳交的檔案。lib0046.h
:你的程式和 grader.cpp
會引入的標頭檔。grader.cpp
:範例評分程式。compile.sh
, compile.bat
在用 Linux/Windows 時,可以執行它來在電腦上編譯。執行範例評分程式時,先輸入一個 problem_type
,代表問題的類型。然後再輸入一個浮點數 solve
並且用
請不要嘗試撰寫題目指定需要函式以外的任何東西,例如自行輸入、輸出等。grader.cpp
可能與實際使用的評分程式上有落差。
除了題目中的操作之外,你還可以呼叫
print(int x)
,Debug 用,會在本地測試時將 printstr(int x)
,Debug 用,會在本地測試時將 舉例來說,如果輸入是:
1
2.36
那麼一個正確的程式可能會輸出:
Total Operations: 8
Error: 0.0000000192
AC: Calculated 4.7199999094, Judge Answer 4.7200000000
請不要輸入任何東西到標準輸出串 (stdout),否則會出現不可預期的後果。計算完成時,請呼叫 void answer(int x)
來回答,x
代表最終算完的答案是 answer()
只能被呼叫一次,否則你會獲得 Wrong Answer。
假設 print
、printstr
、answer
)。該子題的得分會是子題總分乘上比例
評測程式會將若干組
在遇到 Sine 問題時,雞塊想起了他學過的 CORDIC 演算法,敘述如下:
對於一個二維向量
所以對應的旋轉矩陣為
也就是說,
如果我們想要旋轉
如果我們選固定的
對於 Log 問題,可以用類似的方法解決,而前面提到的「神奇序列」可以改為
IOICamp 2024 Day5 pD
題敘靈感:https://twitter.com/kuma_d_fes/status/1730817079450960143
Inspiration: https://www.youtube.com/watch?v=bre7MVlxq7o&t=934s
Grader 參考自 APIO 2023 pC - Alice, Bob, and Circuit
No. | Testdata Range | Constraints | Score |
---|---|---|---|
1 | 0 | problem_type = 1 | 11 |
2 | 1 | problem_type = 2 | 23 |
3 | 2 | problem_type = 3 | 38 |
4 | 3 | problem_type = 4 | 28 |