题意:初始时$x=0$(长度),当$x$为长度时,你可以把$x$变成$\sin^{-1}x,\cos^{-1}x,\tan^{-1}x$之一($x$变为角度),若$x$为角度,你可以把$x$变成$\sin x,\cos x,\tan x$之一($x$变为长度),你需要把$x$变成$\dfrac pq$(长度),输出方案
首先若$p=0$,什么都不用做
若$p=q$,直接$\cos\left(\sin^{-1}0\right)$即可
题目给了一档部分分:可以使用$+1$和取倒数操作,这个很好办,如果要获取$\dfrac pq$,如果$p\geq q$,那么先获取$\dfrac{p-q}q$再$+1$,否则先获取$\dfrac qp$再取倒数,整个过程可以用递归实现
如果只给用三角函数,我们需要用三角函数构造一些基础的操作
$x\rightarrow\dfrac1x$:$\tan\left(\sin^{-1}\left(\cos\left(\tan^{-1}x\right)\right)\right)=\dfrac1x$
$x\rightarrow\sqrt{x^2+1}$:$\dfrac1{\cos\left(\tan^{-1}x\right)}=\sqrt{x^2+1}$
$+1$很难构造,但是注意到$x\rightarrow\sqrt{x^2+1}$意味着$\sqrt x\rightarrow\sqrt{x+1}$,所以我们只需要求出$\sqrt{\left(\dfrac pq\right)^2}$就可以了
具体的:把部分分的递归函数中的$+1$换成$x\rightarrow\sqrt{x^2+1}$并对$\dfrac{p^2}{q^2}$调用函数即可
#includechar s[20];void inv(){ printf("6145");}void sq1(){ printf("63"); inv();}void gao(int a,int b){ if(a==b){ printf("23"); return; } if(a>b){ gao(a-b,b); sq1(); }else{ gao(b,a); inv(); }}int main(){ int a,b; scanf("%s%d/%d",s,&a,&b); if(a==0)return 0; gao(a*a,b*b);}