博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Codeforces - 773A - Success Rate - 二分 - 简单数论
阅读量:5062 次
发布时间:2019-06-12

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

https://codeforces.com/problemset/problem/773/A

一开始二分枚举d,使得(x+d)/(y+d)>=p/q&&x/(y+d)<=p/q,错在这些数是离散的,不能由两边异号判定一定存在这个交点。

然后改成枚举d,使得y=d*q,这样就一定是倍数了。然后就是要想清楚了,找不到这样卡在中间的d,其实都是因为d不够大的原因,d够大保证是可以的除非正确率是100%。

然后就是二分的上界,按道理q的最大值是1e9,y的最大值也是1e9,他们的公倍数肯定在1e18范围内(p和q任意组合能得到的比值最多就是1e18/2,把1e18都枚举完肯定能遍历所有能构造出的情况),那么最大值肯定是1e18/q,多个1都不行。

 

二分,老朋友了,while(1),当l==m的时候是边界,特判就好。

#include
using namespace std;#define ll long longstring a,b;string c;int main(){ int t; scanf("%d",&t); while(t--){ ll x,y,p,q; scanf("%lld%lld%lld%lld",&x,&y,&p,&q); ll l=1,r=1e18/q,m; ll ans; while(1){ m=(l+r)>>1; //cout<
<<" " <
<<" "<
<
=0&&(x+del)>=l*p&&x<=l*p){ ans=l; } else if((r*q-y)>=0&&(x+(r*q-y))>=r*p&&x<=r*p){ ans=r; } else{ ans=-1; } break; } if(m*q
=m*p&&x<=m*p){ r=m; //cout<
<<" ok"<

 其实还有直接用公式解的方法,设最终的状态为pt/qt,只要保证增量为正数即可,当然是pt>=x,qt>=y,还有错的题不会再变对,qt-pt>=y-x,三个式子直接解出来。

这个方法要注意特判p==q的情况,这种时候不能作除法,还有p==0和q==0的时候。

转载于:https://www.cnblogs.com/Yinku/p/10414473.html

你可能感兴趣的文章
我是MVC菜鸟---MVC的优劣对比
查看>>
iOS性能优化/内存优化常用方法
查看>>
51Nod 1421
查看>>
51Nod 1289 大鱼吃小鱼
查看>>
linux ps查进程 kill关闭进程
查看>>
人月神话读后感2
查看>>
JDOM 创建 XML
查看>>
mysql字符串根据指定字符分割
查看>>
腾讯新闻中心首页改版啦
查看>>
hdu 1022 Train Problem I
查看>>
Ubuntu 各版本的几个国内更新源
查看>>
_019_中断系统调用_终端(皆为粗略)
查看>>
datagridview选中一行属性
查看>>
使用repeater实现gridview的功能
查看>>
Java基础:Java抽象类与接口的区别
查看>>
C# winform 类型转换和时间详解
查看>>
排序算法
查看>>
java操作二叉树
查看>>
Properties
查看>>
Java_I/O输入输出_实现读取文件时出现一个表示读取进度的进度条。可以使用java.swing包提供的输入流类ProgressMonitorInputStream...
查看>>