码迷,mamicode.com
首页 > 其他好文 > 详细

数学竞赛

时间:2018-04-18 19:03:03      阅读:189      评论:0      收藏:0      [点我收藏+]

标签:-o   void   source   png   freopen   names   string   out   namespace   

技术分享图片
技术分享图片
技术分享图片
  

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

数学竞赛

标签:-o   void   source   png   freopen   names   string   out   namespace   

原文地址:https://www.cnblogs.com/RogerDTZ/p/8875931.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!