1. 程式人生 > >數學競賽

數學競賽

ace sample img online 長度 分數 getc pre 但是

技術分享圖片
技術分享圖片
技術分享圖片
  

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}\)

等價於對\(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}}\)
,並且可以使用兩種操作:分子加上分母、分子與分母互換。這個做法和子任務三完全一致,直接套用即可。
  
  ? 所以我的腦洞能力和敏感度還是太差了。
  

#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;
}

數學競賽