CodeForces:305B Continued Fractions

来源:互联网 发布:php数组按id排序 编辑:程序博客网 时间:2024/05/23 21:58

这道题很容易想到用double存下各个数,然后倒序依次求,最后比较是否相同。
当然题目不会这样简单,会存在难以解决的精度问题。


例如输入
100    1
2
100 1000000000000000000
就会输出YES


所以应该仔细分析这式子,绕过精度问题。

 

假如p/q等于,那么p/q-a1应该得到一个小数(或者当i=n-2时,可能得到1。想想为什么?),这个小数就是右部分。为避免精度问题这里不用double存而用longlong分别存分子分母,将该分数倒置,而右部分也变成其倒数,它的形式就又像开始那样了。每次计算p/q-ai,要注意除非i是最后一个,否则结果不能等于0,一旦为0应输出NO。

 

我开始没写关于p的这块,以至于最后循环从if第二个条件结束会什么也不输出而WA了多次。
所以应该保证从每个出口结束都会有输出。

 

#include<iostream>#include<cstdio>#include<cmath>#include<cstdlib>using namespace std;int main(){    //freopen("in.txt","r",stdin);    long long mz,mu;    cin>>mz>>mu;    int n;    cin>>n;    double a[100]={0};    for(int i=0;i<n;++i)    cin>>a[i];    bool p=false;    for(int i=0;i<n;++i)    {        double res=(double)(mz)/mu-a[i];        if(!res&&i==n-1){cout<<"YES"<<endl;p=true;}        else if(0<res&&res<=1)        {            mz-=mu*a[i];            long long t=mz;            mz=mu;            mu=t;        }        else        {            cout<<"NO"<<endl;            p=true;            break;        }    }    if(p==false) cout<<"NO"<<endl;    return 0;}



 

原创粉丝点击