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());
        }
};
时间: 2024-11-06 03:33:05

bzoj 2852: 强大的区间 辗转相除的相关文章

欧几里德(辗转相除发)算法

辗转相除,又名欧几里德算法(Euclidean algorithm)乃求两个正整数之最大公约数的算法. 此处用函数的递归调用编写了一个小程序: int gcd(int a,int b){ if(a%b==0) return b; else return gcd(b,a%b);} 非递归调用则: int gcd(int a,int b){ int temp; while(a%b!=0) { temp=b; b=a%b; a=temp; } return b;} 通常情况下在gcd(a,b)=1的情

codeforces 267A A. Subtractions(辗转相除)

题目链接: codeforces 267A 题目大意: 给出一个数对,(a,b)每次用较大的减较小的,直到出现0为止,问要进行多少次操作. 题目分析: 大的减小的操作,可以利用取模优化过程,也就是辗转相除,商是操作次数,余数是下一段与之前较小的数继续进行操作的数,水题不做赘述. AC代码: #include <iostream> #include <cstdio> #include <algorithm> #include <cstring> using n

POJ 2348 Euclid&#39;s Game(辗转相除博弈+自由度分析)

题目链接:http://poj.org/problem?id=2348 题目大意:给你两个数a,b,Stan和Ollie轮流操作,每次可以将较大的数减去较小的数的整数倍,相减后结果不能小于0,谁先将其中一个数字变成0谁就获胜. 解题思路:看了挑战程序设计上的,这里我们先假设a<b,当b是a的整数倍是必胜态.我们讨论以下b不是a的整数倍,此时a,b的关系按照自由度的观点(第一次听说),可以分为以下两种情况: ①b-a<a ②b-a>a 那么对于①,玩家只有从b中减去a这一个选择.如果b-a

欧几里德算法(辗转相除)证明

过了这么久,终于知道了辗转相处的证明了,以前只是记住了,但不是真的很理解,现在写一下它的证明,以便下次忘了的时候看一下.辗转相除是求两个数的最大公约数的. 要证这个定理成立,只需要证明 gcd(a, b) = gcd(b, a % b) 就行了 证明:令a % b = r, 所以a = k * b + r, 所以r = a - k * b,假设d为a,b的一个公约数,那么 d|a,  d|b,(d|a的意思就是d整除a,也就是a能被d整除),所以a - k * b 也一定能被d整除,即 d|r,

求两个正整数的最大公约数——辗转相减法

问题:求解两个正整数的最大公约数 今天第一节形式化方法课,举了一个简单的例子——辗转相减法求解两个正整数的最大公约数,来讲解形式化方法的基本内容,让我们有感性的认识.其基本思路如下: 1.任意给定两个正整数a和b: 2.若a和b不相等,则执行第3步: 3.选择a.b中较大者,将较大者与较小者的差赋值给较大者: 4.判断重新赋值后的a和b是否相等,若不相等则继续执行第3步,否则执行第5步: 5.返回a或b. 程序如下(Java编写). 程序中前断言和后断言是形式化方法中的内容,前断言判断用于计算的

[SDOI2009]SuperGCD 【压位高精度+辗转相减】

题目链接: https://www.luogu.org/problemnew/show/P2152 题目概述:  计算两个大整数(A,B)的最大公因数 数据范围 0 < A , B ≤ 10 ^ 其一在于辗转相减法--辗转相除法的优化(针对大数,避免了大数的模运算带来的多方面的复杂度) 思想就是 以数次 A-B  代替 A%B (这二者是等价的) 辗转相减法: 1 /* 2 Write(X) 输出X 3 Down(X) X除以2 4 Up(X) X乘以2 5 */ 6 void Solve(){

数据结构与算法C++描述学习笔记1、辗转相除——欧几里得算法

前面学了一个星期的C++,以前阅读C++代码有些困难,现在好一些了.做了一些NOI的题目,这也是一个长期的目标中的一环.做到动态规划的相关题目时发现很多问题思考不通透,所以开始系统学习.学习的第一本是<数据结构与算法C++描述>第三版,边学边做一些笔记.所以这些笔记中的代码有很多将会非常简单,甚至可能只有一个记录或者结论. 辗转相除法用来求两个整数的最大公约数,即能同时整除两个数的最大整数.程序如下: int gdc(int m,int n){ int rem; while(n!=0){ //

BZOJ 3065 带插入区间K小值 替罪羊树套线段树

题目大意:带插入,单点修改的区间k小值在线查询. 思路:本年度做过最酸爽的题. 树套树的本质是一个外层不会动的树来套一个内层会动(或不会动)的树.两个树的时间复杂度相乘也就是差不多O(nlog^2n)左右.但是众所周知,高级数据结构经常会伴有庞大的常数,所以一般来说树套树的常数也不会小到哪去.所以在做这种题的时候先不要考虑常数的问题... 为什么要用替罪羊树呢?因为一般的平衡树都是会动的,这就很难办了.外层的树动了之后,内层的树肯定也是会动的.很显然,一般的二叉平衡树会经常会旋转,这样在动外层的

bzoj 3065: 带插入区间K小值 替罪羊树 &amp;&amp; AC300

3065: 带插入区间K小值 Time Limit: 60 Sec  Memory Limit: 512 MBSubmit: 1062  Solved: 253[Submit][Status] Description 从 前有n只跳蚤排成一行做早操,每只跳蚤都有自己的一个弹跳力a[i].跳蚤国王看着这些跳蚤国欣欣向荣的情景,感到非常高兴.这时跳蚤国王决定理性愉悦一 下,查询区间k小值.他每次向它的随从伏特提出这样的问题: 从左往右第x个到第y个跳蚤中,a[i]第k小的值是多少. 这可难不倒伏特,