这道题很容易想到用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;
}