标签:style blog http io ar color os sp for
题目地址:
ayyzvijos:http://pingce.ayyz.cn/vijos/Problem_Show.asp?id=2016
vijos:https://vijos.org/p/1912
COGS:http://218.28.19.228/cogs/problem/problem.php?pid=1810
题目来源:NOIP2014普及组第二题
问题分析:题目描述很长,归纳起来,大意就是:
在区间[1,L]内求出2个数A’、B’,这两个数满足:
一、gcd(A’,B’)=1,即A’和B’互素;
二、A/B≤A’/B’;
三、|A’/B’-A/B|的值最小。
考虑到L很小,因此求这两个数时直接穷举即可,不会超时。为了方便实现,我们采用下面的算法:
设置一个存储最小值的变量ans(初值为maxlongint),以及两个临时变量k、l。每次枚举,先判断前两个条件,如果都满足,那么判断|A’/B’-A/B|的值是否小于ans。如果小于,那么ans=|A’/B’-A/B|,k=A’,l=B’。最后输出k和l即可。
这个算法用到了一个性质,即
任何一对互素的整数的比值都不与其它互素整数的比值相等。
这样,只要精度足够,每个比值都对应唯一的一对k和l,它的逆命题也成立。这样程序就很简单了。
参考代码:
program radio; var a,b,l,i,j,k,m:longint; p,q,ans:double; function gcd(x,y:longint):longint; begin if y=0 then exit(x) else exit(gcd(y,x mod y)); end; begin assign(input,‘ratio.in‘); reset(input); assign(output,‘ratio.out‘); rewrite(output); readln(a,b,l); p:=a/b; ans:=1010101010; for i:=1 to l do for j:=1 to l do if (gcd(i,j)=1)and(i/j>=p)and(i/j-p<ans) then begin ans:=i/j-p; k:=i; m:=j; end; writeln(k,‘ ‘,m); close(input); close(output); end.
标签:style blog http io ar color os sp for
原文地址:http://www.cnblogs.com/changke/p/4138561.html