bzoj 2852: 强大的区间 辗转相除
2852: 强大的区间
Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 45 Solved: 12
[Submit][Status][Discuss]
Description
curimit很喜欢区间,最近发现了一种很强大的区间。
curimit发现有的区间虽小,比如 (1.99998, 2.000001),但是其中却包含了一个整数2。
但是有的区间较大,比如(1.0001, 1.99998),但是其中却一个整数都没有。
他觉得包含整数的区间很强大,并且提出了一个问题:
我们先给出两个非负实数a,b我们要求一个最小的正整数k ,使得区间(a*k, b*k)是一个包含至少一个整数的区间。
举个例子来说吧,比如我们输入a=1.2 b=1.3 ,那么:
当k=1时, 区间为(1.2 , 1.3) 其中没有整数;
当k=2时, 区间为(2.4 , 2.6) 其中没有整数;
当k=3时, 区间为(3.6 , 3.9) 其中没有整数;
当k=4时, 区间为(4.8 , 5.2) 其中包含了一个整数5。
所以使得区间(1.2*k, 1.3*k)包含一个整数的最小正整数k是4。
Input
两个非负实数a,b。
Output
最小的k的值。
Sample Input
1.2 1.3
Sample Output
4
Hint
Hint
HINT
a,b整数部分不超过2^31-1,a,b小数部分位数不超过300位。
这样的题还是很好耍的。首先(a,b)与(a-1,b-1)答案相同,所以保证a<1,若此时b>=0,return 1,否则假设答案为k,中间的数为t,那么我们可以吧原来的范围限定t的式子【a*k<=t<=b*k】化成限定k的【t/b<=k<=t/a】,然后发现就是一个子问题啦。
话说我这个真的是辗转相除吗,我看网上的程序还用了gcd的。。。。
import java.util.*; import java.math.*; public class b2852 { static BigDecimal solve(BigDecimal a,BigDecimal b) { BigDecimal c; c=a; c=c.setScale(0,BigDecimal.ROUND_DOWN); a=a.subtract(c); b=b.subtract(c); //System.out.println(a.toString()); //System.out.println(b.toString()); if (b.compareTo(BigDecimal.ONE)>=0) return BigDecimal.ONE; b=BigDecimal.ONE.divide(b,1000,BigDecimal.ROUND_HALF_UP); a=BigDecimal.ONE.divide(a,1000,BigDecimal.ROUND_HALF_UP); BigDecimal t=solve(b,a); b=b.multiply(t); return b.setScale(0,BigDecimal.ROUND_UP); } public static void main(String[] args) { Scanner in=new Scanner(System.in); BigDecimal a=in.nextBigDecimal(); BigDecimal b=in.nextBigDecimal(); a.setScale(1000,BigDecimal.ROUND_HALF_UP); b.setScale(1000,BigDecimal.ROUND_HALF_UP); System.out.println(solve(a,b).toString()); } };
by mhy12345(http://www.cnblogs.com/mhy12345/) 未经允许请勿转载
本博客已停用,新博客地址:http://mhy12345.xyz