軟件工程系嘅小 W 而家喺工程製圖嘅試場入面,但佢只係帶咗一把畀歲月磨甩晒刻度嘅直尺同一副圓規。佢冇晒辦法,唯有向幾何作圖能力驚人嘅你求助。請你用冇刻度嘅直尺同圓規,幫小 W 又快又準確噉完成製圖。
我哋將問題簡化一下。假設小 W 已經有座標系同單位長度,佢要你用尺規作出長度 $L_0$,即係得到點 $(L_0,0)$。
你可以用以下三種操作:
- $line(A,B)$:作一條經過點 $A$ 同點 $B$ 嘅直線。
- $circle(O,A,B)$:以 $AB$ 之間嘅距離做半徑,以點 $O$ 做圓心畫圓。
- $intersect(i,j)$:標記第 $i$ 個圖形同第 $j$ 個圖形嘅所有交點,有幾多個就標記幾多個。
一開始,小 W 會提供原點 $O(0,0)$,佢係 $0$ 號點。單位長度由 $1$ 號點 $(1,0)$ 提供。另外亦會提供 $x$ 軸($0$ 號圖形)同 $y$ 軸($1$ 號圖形)。
操作得到嘅所有新點同新圖形,都會接住編號。
假設而家嘅編號係 $n$,咁 $intersect$ 操作產生嘅點就會標記為 $n+1$。
如果兩個圖形冇交點,就唔會產生新點。
如果有兩個交點,$x$ 值較細($x$ 值相同時就揀 $y$ 較細)嗰個會標記為 $n+1$,另一個就係 $n+2$。
請你得到點 $(L_0,0)$,並指出佢嘅編號。你唔需要得到精確值,但你同精確值嘅差距,以及你用咗幾多次操作,都會影響你嘅得分。
輸入格式
呢題係提交答案題,所有輸入數據 draw1.in~draw10.in 已經放喺試題目錄入面。
每份輸入數據 $x_0$ 係一條 python 計算表達式。當中 ** 代表乘方運算,例如 3 ** 2 代表 $3^2$,2 ** 0.5 代表 $\sqrt2$。
為咗提供較高精度,表達式入面嘅數會轉成 decimal 類型,即係高精度小數。當中 Decimal(2) 就代表 $2$。
輸入保證數同符號之間、符號同符號之間,都會用一個空格分隔。
python 程式碼嘅輸出,就係要構造嘅數。
請留意,直接用 python 計出嚟嘅結果係近似值,但實際要求嘅係精確值,即係用嚟同你得到嘅結果比較嗰個值係精確值。
另外,我哋仲提供咗 draw.pdf,用方便閱讀嘅方式列出每組數據嘅表達式。
輸出格式
對於提供嘅 10 個輸入檔案 draw1.in~draw10.in,你需要分別提交輸出檔案 draw1.out~draw10.out。
輸出檔案第一行係一個整數 $n$,代表操作數。之後 $n$ 行,每行一個操作,三種操作對應嘅格式係:
line: L A B circle: C O A B intersect: I i j
參數嘅意思同題目描述一樣。
輸出檔案最後一行有一個整數,代表最後得到嗰個點嘅編號。
樣例
輸入格式 1
Decimal( 2 ) ** ( Decimal( 1 ) / Decimal( 2 ) )
輸出格式 1
5 C 0 0 1 I 1 2 C 0 1 3 L 1 3 I 0 3 5
說明
樣例入面五個操作嘅意思如下:
- 以 $O$ 點做圓心、單位長度做半徑畫圓,呢個圓係 $2$ 號圖形。
- 取 $2$ 號圖形(圓)同 $y$ 軸嘅交點,交點編號係 $2(0,-1),3(0,1)$。
- 以 $O$ 點做圓心,以 $1$ 號點同 $3$ 號點之間嘅距離做半徑畫圓,呢個圓係 $3$ 號圖形。
- 連接點 $(1,0),(0,1)$,產生嘅直線係 $4$ 號圖形。
- 取 $3$ 號圖形(圓)同 $x$ 軸嘅交點,交點編號係 $4(-\sqrt2,0),5(\sqrt2,0)$。
所以 $5$ 號點就係最後要得到嘅點。
評分方式
對於提供嘅 10 個輸入檔案 draw1.in~draw10.in,我哋分別提供評分參數檔案 draw1.ans~draw10.ans。
評分參數檔案共有十行,每行兩個數 $c_i,x_i$,表示如果最後得到嘅點 $(x,0)$ 嘅橫座標 $x$ 同 $L_0$ 嘅絕對值之差唔超過 $10^{-x_i}$,而且用嘅操作數 $n\le c_i$,就可以得 $i$ 分。
評測會取所有符合條件嘅分數當中最高嗰個;如果冇任何條件符合,就得 0 分。
點樣測試你嘅輸出
我哋提供 checker 呢個工具,測試你嘅輸出檔案可唔可以接受。首先開啟終端,執行以下指令進入本題嘅資料夾:
cd draw
然後執行:
./checker <case_no>
當中 case_no 係測試數據嘅編號。例如:
./checker 3
就會測試 draw3.out 可唔可以接受。
你執行呢個程式之後,checker 會根據你提供嘅輸出檔案顯示測試結果,包括:
- 非法退出:未知錯誤。
Invalid parameters for checker.:傳畀checker嘅參數唔合法。Input/Output file does not exist.:輸入/輸出檔案唔存在。Output invalid:輸出檔案有錯,呢個時候可能會附有具體錯誤訊息。Correct! Your answer is n. Your score is s.:輸出可以接受,用咗 $n$ 次操作,呢個測試點得 $s$ 分。
更多功能
checker 仲可以檢查任意輸入、輸出檔案嘅測試結果,方法係喺終端執行:
cd draw ./checker <input_file> <output_file> <ans_file>
當中 input_file、output_file 同 ans_file 分別係輸入、輸出同評分參考檔案嘅名稱。
例如:
./checker draw3.in draw3.out draw3.ans
就會測試 draw3.out 可唔可以接受。
用 -w 可以輸出產生嘅每一個點嘅座標。輸出每行嘅格式係:
id x y
分別代表點嘅編號、$x$ 座標同 $y$ 座標。具體用法係:
./checker -w <input_file> <output_file> <ans_file>
或者:
./checker -w <case_no>
例如:
./checker -w draw3.in draw3.out draw3.ans
用 -i 可以同時輸出參賽者嘅輸出,方便除錯。具體用法係:
./checker -i <input_file> <output_file> <ans_file>
或者:
./checker -i <case_no>
例如:
./checker -i draw3.in draw3.out draw3.ans
用 -e prec 可以指定 checker 計算時嘅精度(有效位數)。唔用呢個選項時,prec 預設係 200。具體用法係:
./checker -e <prec> <input_file> <output_file> <ans_file>
或者:
./checker -e <prec> <case_no>
例如:
./checker -e 50 draw3.in draw3.out draw3.ans
-e prec、-w 同 -i 選項可以同時加入,次序不限,例如:
./checker -w -i -e 50 draw3.in draw3.out draw3.ans
提示
我哋可以用 python 得到表達式嘅近似值。具體嚟講,喺終端執行 python 之後,輸入:
from math import *
from decimal import *
getcontext().prec = 100
然後將輸入檔案入面嘅表達式(python 程式碼)複製到終端視窗,再按 Enter,就可以得到表達式嘅近似值(上面程式碼入面嘅 100 可以換成你想要嘅精度)。
特別提示
如果你用自己產生嘅輸入檔案嚟除錯,有可能因為規模太大而令 checker 出錯。遇到呢種情況,請試下規模細啲嘅數據。
請妥善保存輸入檔案 draw*.in、你嘅輸出檔案 draw*.out 同評分參數檔案 draw*.ans,並及時備份,以免誤刪。