codeforces 305B. Continued Fractions (递归的思想)

http://codeforces.com/problemset/problem/305/B

大致题意:问是否等于

too young too simple。 开始直接用浮点递归处理。。。结果可想而知。
再一次出现运行结果不一样的问题:
对于数据:
39088169 24157817
36
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2
本地结果是
39088169 24157817
36
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2
YES

结果在codeforces测评机上的结果是:

可能真和机器相关。

浮点问题横亘在前方。。。这个方案作罢。
其实我们知道它一定和递归有点关系,继续探索发现。。。
我们看一个简单的等式:


把它上下翻转一下呢?

是的,等号右边新的分数,等号左边的加式都和原来有一定的相似度,递归就这样形成了
这样迭代下去,如果是相等的,那么右边一定是等于0的

写的时候注意这样的陷阱:
跳出语句不要这样写:
if(q==0||a[i]*q<0||a[i]*q>p) break;
因为有这样的"事实": 105000000000078855*105000000000078855=262882295792523313
是的,我亲测了。
cin>>p;
cout<<p*p<<endl;
105000000000078855
262882295792523313

#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
typedef long long LL;
LL a[100],p,q,n;
int main()
{
    //freopen("cin.txt","r",stdin);
    while(cin>>p>>q){
        scanf("%I64d",&n);
        for(int i=0;i<n;i++){
            scanf("%I64d",&a[i]);
        }
        int i=0;
        for(i=0;i<n;i++){
            if(q==0||p/q<a[i]) break;
            p=p-a[i]*q;
            LL t=p;
            p=q;
            q=t;
        }
        if(i==n&&q==0) puts("YES");
        else puts("NO");
    }
    return 0;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值