數學競賽
阿新 • • 發佈:2018-04-18
ace sample img online 長度 分數 getc pre 但是 等價於對\(x\)依次取\(tan^{-1}\),\(cos\),最後取倒數。這一個操作用\(tan\)的三角函數線轉換一下就可以得出。
? 但是7操作湊不出來,9操作又引入新的根號,很麻煩,不可以直接套用回子任務三的解法,怎麽做?
? 發現9操作有個很神奇的變式:\(\sqrt x \rightarrow\sqrt{(\sqrt x)^2+1}=\sqrt{x+1}\),如果我們在根號的意義下考慮,這就相當於7操作!
? 問題變為我有一個終止狀態\(\frac {\sqrt{p^2}}{\sqrt{q^2}}=\sqrt{\frac {p^2}{q^2}}\) ,並且可以使用兩種操作:分子加上分母、分子與分母互換。這個做法和子任務三完全一致,直接套用即可。
? 所以我的腦洞能力和敏感度還是太差了。
Sample Input
111111000
1/2
Sample Output
63616161
Solution
? 前面兩個子任務非常容易構造。
? 第三個子任務比較簡單,而且非常關鍵。不斷使用7、8操作,我們一定可以湊出任意一種分數\(\frac pq\)。反過來考慮怎麽從\(\frac pq\)變為\(\frac 01\):如果分子比分母大,則一直減去分母。隨後若分子為0,則達到目標並退出,否則取一個倒數,重復上述步驟,即:
void work(int p,int q){
while(p>=q) p-=q;
if (p==0) return; //Done
work(q,p);
}
? 然而我們發現後面的任務中7操作和8操作是禁用的,這個方法無法解決後面的問題。與其形成對比,前6個操作卻是一直可用。考慮能否用前6個操作強行湊出7~9操作。
? 首先看對一個角度\(x\)取余變為\(90^\circ-x\),等價於對\(x\)先取\(sin\),再取\(cos^{-1}\)。
? 然後看回題目中的操作:
? 8: 對一個長度\(x\)取倒數變為\(\frac 1x\),等價於對\(x\)先取\(tan^{-1}\),再取余,最後取\(tan\)。
? 9: \(x\rightarrow\sqrt{x^2+1}\)
? 但是7操作湊不出來,9操作又引入新的根號,很麻煩,不可以直接套用回子任務三的解法,怎麽做?
? 發現9操作有個很神奇的變式:\(\sqrt x \rightarrow\sqrt{(\sqrt x)^2+1}=\sqrt{x+1}\),如果我們在根號的意義下考慮,這就相當於7操作!
? 問題變為我有一個終止狀態\(\frac {\sqrt{p^2}}{\sqrt{q^2}}=\sqrt{\frac {p^2}{q^2}}\)
? 所以我的腦洞能力和敏感度還是太差了。
#include <cstdio>
#include <cstring>
using namespace std;
char tmp233[10];
inline int getInt(){
char c=getchar(); int x=0,f=1;
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while('0'<=c&&c<='9'){x=x*10+c-'0';c=getchar();}
return x*f;
}
void dfs(int p,int q){
int t7=0;
while(p>=q) p-=q,t7++;
if(p) dfs(q,p),printf("6145");
while(t7--) printf("636145");
}
int main(){
freopen("input.in","r",stdin);
scanf("%s",tmp233);
int p=getInt(),q=getInt();
if(!p){return 0;}
dfs(p*p,q*q);
return 0;
}
數學競賽