题目大意
本题给我们一个分数p/q,再给我们n个数字a1,a2,a3.....an。问p/q是否等于这n个数构成的连分数。由于数据很大所以肯定用long long最好用cin,cout。(本题单组数据)
样例输入
9 4
2
2 4
9 4
3
2 3 1
9 4
3
1 2 4
样例输出
YES
YES
NO
题目分析
一开始想复杂了。以为有什么公式,后来看了别人的代码才知道只需要p/q-a1(分数形式)=后面的东西。然后在把等号两边同时分子分母交换,这样右边又变成了整数加分数的形式,然后再重复同样的操作一共n次,若最后相减的结果为0则判断YES,否则判断NO。
其他问题
1.这个题由于数据很大,直接把等号右边的数据相加再和p/q比较是不靠谱的,会溢出数据(就算是LL)。而相减的话思路也会更简单。
2.在每次执行操作之前一定要判断两点,第一是若是分母为0了就出问题了肯定可以退出了,因为再按照通分相减计算会出问题,再者,本来分母就不能为0。第二也是很重要的一点就是再执行操作之前一定好判断p/q是否是小于要减的那个数ai,如果小于,肯定不能,因为第一这样p/q会被减成负数,答案不成立。第二由于我们是p - (q×ai)如果操作之后再判断在数据非常大的情况下q×ai会溢出数据,从而会错判。
代码如下
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#define LL long long
using namespace std;
LL num[100];
int main()
{
LL p,q,x;
cin >> p >> q >> x;
for(int i = 0 ; i < x ; i++)
cin >> num[i];
bool flag = true;
for(int i = 0 ; i < x ; i++)
{
if( q == 0 || (p/q)<num[i])
{
flag = false ; break;
}
p-=(q*num[i]);
swap(p,q);
}
if(q == 0 && flag == true) printf("YES\n");
else printf("NO\n");
}