[UOJ 12]猜数

Description

Input

Output

Sample Input1

1
1 4

Sample Output1

4 5

Sample Explanation1

Sample Input2

12 8

Sample Output2

8 10

HINT

题解

此题巨坑无比。不要用unsigned/cin。

其次a,b是g的倍数的意思是“对于输入的g,a,b一定要是g的倍数”,而不是“对于所有a,b,输入的g满足a,b是g的倍数”(这种理解其实直接就是g=1,而输入并不保证g=1)。

我们有n=l×g。那么我们分开来讨论:

对于最小值,由均值不等式:a+b≥2√ab=2√n=2√lg(当且仅当a=b取等)。由于a,b≥g,显然可以取等,满足。

对于最大值,由于a+b≥2√lg,我们记f(x)=a+b=n/b+b,显然在(0,√n]是单调递减的。由于b≥g,故在b=g处取最大值。

综上最小值为2√lg,最大值为l+g。

精度问题
有人可能会写:
ans_min = (long long)sqrt((double)g × l);
这样会被卡精度,因为double大概只有15位10进制有效数字。只能得到60分。
解决方法是:
ans_min = (long long)sqrt(l / g) × g;
当然有人可能直接long double保平安了……

 1 #include<set>
 2 #include<map>
 3 #include<ctime>
 4 #include<cmath>
 5 #include<queue>
 6 #include<stack>
 7 #include<cstdio>
 8 #include<string>
 9 #include<vector>
10 #include<cstring>
11 #include<cstdlib>
12 #include<iostream>
13 #include<algorithm>
14 #define LL long long
15 #define RE register
16 #define IL inline
17 using namespace std;
18
19 LL a,b;
20 int t;
21
22 int main()
23 {
24     cin>>t;
25     while (t--)
26         {scanf("%lld%lld",&a,&b);
27             printf("%lld %lld\n",2*(LL)sqrt(b/a)*a,a+b);}
28     return 0;
29 }
时间: 2024-10-13 20:31:52

[UOJ 12]猜数的相关文章

【UER #1】[UOJ#12]猜数 [UOJ#13]跳蚤OS [UOJ#14]DZY Loves Graph

[UOJ#12][UER #1]猜数 试题描述 这一天,小Y.小D.小C正在愉快地玩耍. 小Y是个数学家,他一拍脑袋冒出了一个神奇的完全平方数 n. 小D是个机灵鬼,很快从小Y嘴里套出了 n的值.然后在脑内把 n写成了 a×b的形式.其中 a,b 都是正整数. 小C是个八卦狂,他发现小D从小Y那里获知了神奇的东西,于是死缠烂打追问小D.最后小D说道:“我可以告诉你正整数 g和 l的值,我保证 ab=gl=n且 a,b都是 g 的倍数.但是 a,b 我可不能告诉你.” 这可急坏了小C.他决定退而求

模拟算法_掷骰子游戏&amp;&amp;猜数游戏

模拟算法是用随机函数来模拟自然界中发生的不可预测的情况,C语言中是用srand()和rand()函数来生成随机数. 先来介绍一下随机数的生成: 1.产生不定范围的随机数 函数原型:int rand() 产生一个介于0~RAD_MAX间的整数,其具体值与系统有关系.Linux下为2147483647.我们可以在include文件夹中的stdlib.h中可以看到(Linux在usr目录下,Windows在安装目录下) 1 #include<stdio.h> 2 #include<stdlib

BZOJ 2222: [Cqoi2006]猜数游戏【神奇的做法,傻逼题,猜结论】

2222: [Cqoi2006]猜数游戏 Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 604  Solved: 260[Submit][Status][Discuss] Description 佳佳和明明玩一个猜数游戏.佳佳想一个1~n之间的整数,明明每次可以随便猜一个数.从第二次猜测起,佳佳告诉明明本次猜测的数和上次猜测的数相比哪个更接近.B表示本次猜测的数更接近,W表示上次猜测的数更接近.如果两次猜测的接近程度一样,则既可回答B也可回答W.

猜数游戏,随机产生一个数字(0-9),自己看几次能出来,并且给出提示。

1 /* 2 * 猜数游戏,随机产生一个数字(0-9),自己看几次能出来,并且给出提示. 3 * */ 4 import java.util.Random; 5 import java.util.Scanner; 6 7 public class WhileTest{ 8 public static void main(String args[]){ 9 10 Scanner sc = new Scanner(System.in); 11 Random ran = new Random(); 1

1536 不一样的猜数游戏

1536 不一样的猜数游戏 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 瓦斯亚和皮台亚在玩一个简单的游戏.瓦斯亚心中想一个整数x,它是1到n之间的整数.然后皮台亚尝试着猜这个数字. 皮台亚每次问一个形如这样的问题:这个x是y的倍数吗? 这个游戏的流程是这样的:首先皮台亚把所有他想问的形如上述的问题都问出来(当然他也可以不问任何问题),然后瓦斯亚针对每一个问题给出yes或no的答案.最后皮台亚根据这些问题推断出瓦斯亚心中所想

bzoj 1594: [Usaco2008 Jan]猜数游戏——二分+线段树

Description 为了提高自己低得可怜的智商,奶牛们设计了一个新的猜数游戏,来锻炼她们的逻辑推理能力. 游戏开始前,一头指定的奶牛会在牛棚后面摆N(1 <= N<= 1,000,000)堆干草,每堆有若干捆,并且没有哪两堆中的草一样多.所有草堆排成一条直线,从左到右依次按1..N编号,每堆中草的捆数在1..1,000,000,000之间. 然后,游戏开始.另一头参与游戏的奶牛会问那头摆干草的奶牛 Q(1 <= Q <= 25,000)个问题,问题的格式如下: 编号为Ql..Q

LintCode 666. 猜数游戏 II

我们正在玩猜数游戏, 游戏内容如下:我在 1到 n 的范围内选择一个数作为待猜的数, 你需要来猜这个数,每次你猜错的时候, 我会告诉你我选择的这个数是比你说的数要高还是低, 但是, 当你猜这个数为 x 并且猜错的时候你需要支付 $x. 当你猜到我选择的数时, 你将赢得这场游戏 样例给出 n = 10, 我选择待猜数为 8第一轮: 你猜测为 5, 我告诉你待猜的值要更大一些. 你需要支付 $5第二轮: 你猜测为 7, 我告诉你待猜的值要更大一些. 你需要支付 $7第三轮: 你猜测为 9, 我告诉你

简单猜数游戏2

/*简单猜数游戏,magic number#2,版本*/#include<stdio.h>#include<stdlib.h> int main(void){ int magic; /*magic number*/ int guess; /*user's guess*/ printf("\nWelcome to the magic number game\n"); magic=rand(); /*产生随机数*/ printf("\nGuess the

简单猜数游戏1

/*简单猜数游戏,magic number#1,版本*/#include<stdio.h>#include<stdlib.h> int main(void){ int magic; /*magic number*/ int guess; /*user's guess*/ printf("\nWelcome to the magic number game\n"); magic=rand(); /*产生随机数*/ printf("\nGuess the