博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Codeforces Continued Fractions
阅读量:6542 次
发布时间:2019-06-24

本文共 1514 字,大约阅读时间需要 5 分钟。

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

数学,模拟

题意:略

这题,可以按照后面Hint那样逆回来模拟,但是long long会溢出,case 40#中的溢出,让人没了脾气,刚好溢出又刚好能输出YES,所以就正着模拟,可以避开溢出问题,但是要注意一点

为了叙述,我们就举n=2的例子

对于等式可以写成  a1 + (1/x) = p/q , 如果它们相等,那么我们先算出 p / q的整数部分 Int = p / q (计算机做除法自动取整)

若Int  <  a1  , 那么这个等式是不可能相等的,一定是左边大

若Int >   a1 + 1 , 那么这个等式是不可能相等的,一定是右边大

所以当 Int = a1  或   Int = a1+1  的时候,等式都有可能相等,为什么Int = a1 + 1的时候也可能等式相等呢?  因为对于左式的另一部分  1/x , 它是满足 1/x <= 1的

(现在假设n=2,那么a2 = 1的话,1/x = 1 , 当n!=2的时候,后面部分一样可能出现 1/x = 1)

既然可能相等,我们就继续处理下去

等式两端都去掉a1,即去掉整数部分 , 那么右边就变成了   (p - q*a1)/q

则  1/x  =  (p - q*a1) / q

然后两者都去倒数  x = q / (p - q*a1)

那么又变回前面的模式,就一直迭代下去

 

那么怎么判断NO或者YES呢?

如果YES的话,说明等式相等,按照上面的迭代方法,是能一直迭代到最后一个ai的,所以如果再迭代中途就结束了,那么等式肯定不等

中途结束是什么?

看看前面的   1 / x = (p - q * a1) / q  ,左端是一定不会0的,但是右边就不一定了,如果出现了右边为0,说明了两个等式不等(这里不累述,易懂)

迭代完n次后,一定就是相等的吗?不是的!

试想一下,迭代的过程其实做了什么,就是   每次都去掉一个整数部分(ai),将剩余的分数部分取倒数,然后继续去整数,可知左式到最后一定会变为0(当所有ai都去掉后),在左式去掉整数部分的过程中,右式也在去除,如果右式一开始就比左式大,那么结果就是,左式为0时,右式不为0

所以迭代完n次后,还要判断一下右式是否为0,是的话,那么相等,否则,还是不等的

 

文字说得有点乱,其实思想很容易理解,看代码吧

#include 
#include
#include
#include
using namespace std;#define N 100typedef long long ll;ll a[N],p,q,n;int main(){ cin >> p >> q; cin >> n; for(int i=0; i
> a[i]; bool ok = true; for(int i=0; i
a[i]+1) { ok = false ; break; } if(Int == a[i]) p %= q; else p = p%q + q;// p -= q*a[i]; //虽然也能AC虽然本质一样,但不太安全,可能溢出,不过数据中测不出来 swap(p,q); } if(ok && q == 0) cout << "YES" << endl; //一定要两个条件都满足 else cout << "NO" << endl; return 0;}

 

转载地址:http://xfsdo.baihongyu.com/

你可能感兴趣的文章
eclipse 设置注释模板详解,与导入模板方法介绍总结
查看>>
Cocos2d-x3.2 文字显示
查看>>
mongodb group
查看>>
session_start()放置位置的不正确引发的ROOT常量 未定义的错误
查看>>
如何设定VDP同时备份的任务数?
查看>>
ipsec的***在企业网中的经典应用
查看>>
过来人谈《去360还是留在百度?》
查看>>
mysql备份工具innobackupex,xtrabackup-2.1安装,参数详解
查看>>
本地Office Project计划表同步到SharePoint2013任务列表的权限问题
查看>>
Windows2008 R2 GAC权限问题
查看>>
洛谷——P1469 找筷子
查看>>
springboot项目自定义注解实现的多数据源切换
查看>>
特此说明
查看>>
使用flume替代原有的scribe服务
查看>>
Windows Server 2008 启用公共文件夹共享
查看>>
Apple Watch的非“智能手表”卖点
查看>>
Python的函数参数传递:传值?引用?
查看>>
[转]分享2011年8个最新的jQuery Mobile在线教程
查看>>
android call require api level
查看>>
SQLSERVER是怎麽通过索引和统计信息来找到目标数据的(第一篇)
查看>>