zoukankan      html  css  js  c++  java
  • bzoj 2852: 强大的区间 辗转相除

    2852: 强大的区间

    Time Limit: 5 Sec  Memory Limit: 128 MB
    Submit: 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

    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());
            }
    };
  • 相关阅读:
    java笔试面试题目收集(一)
    java--用 * 打印出各种图形(新手请进)
    TextView属性大赏
    Meterial Or Ios ?
    android开发之后端云bmob的使用
    关于android开发自定义view
    第二周作业——面向过程(或者叫结构化)分析方法与面向对象分析方法到底区别在哪里?
    移动APP开发使用什么样的原型设计工具比较合适?
    测试
    转:nohup命令及其输出文件
  • 原文地址:https://www.cnblogs.com/mhy12345/p/4516768.html
Copyright © 2011-2022 走看看