zoukankan      html  css  js  c++  java
  • 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。他决定退而求其次,找出a+b的最小值和最大值。请你帮帮他吧!

    输入格式

    第一行一个正整数 T,表示有 T 组询问。

    接下来 T 行每行两个正整数 g,l 表示一组询问。
    输出格式

    对于每个询问输出一行两个正整数,分别表示 a+b 的最小值与最大值。保证问题有解。

    C/C++ 输入输出 long long 时请用 %lld。C++ 可以直接使用 cin/cout 输入输出。

    样例一

    input

    1
    1 4

    output

    4 5

    explanation

    只有三组解:{a=1,b=4},{a=2,b=2},{a=4,b=1}。
    样例二

    input

    1
    2 8

    output

    8 10

    保证 T≤5。

    时间限制:1s

    空间限制:256MB

    题解

    UOJ自带题解:
    算法一

    直接暴力枚举所有可能的 a,b 然后判定。可以得30分。
    算法二

    由于 a,b 都是 g 的倍数,而 ab=gl=n,所以当然 l 也是 g 的倍数。

    既然如此,我们可以暴力枚举所有 l/g=st 的拆分,然后 a=gs,b=gt。

    于是暴力枚举所有 l/g 的约数,是 O(l/g−−−√) 的。可以得60分。
    算法三

    其实根本不用枚举约数。

    考虑最小值。只看 n=ab 这个限制,根据均值不等式,最小值显然在 {a=n−√,b=n−√} 时取到。而根据题目条件,这显然是一组合法解。所以最小值就是 2gl−−√。

    考虑最大值。只看 n=ab,a≥g 这两个限制。显然最大值在 {a=g,b=l} 时取到。而根据题目条件,这显然是一组合法解。所以最大值就是 g+l。

    这样好好写就能获得 100 分。
    精度问题

    有人可能会写:

    ans_min = (long long)sqrt((double)g * l);

    这样会被卡精度,因为double大概只有15位10进制有效数字。只能得到60分。

    解决方法是:

    ans_min = (long long)sqrt(l / g) * g;

    当然有人可能直接long double保平安了……

    代码

    int main()
    {
    	int t;
    	cin>>t;
    	while(t--)
    	{
    		LL g,l;
    		cin>>g>>l;
    		cout<<2*(long long)sqrt((long double)g*l)<<" "<<g+l<<endl;
    	}
    	return 0;
    }
  • 相关阅读:
    DataGridView如何获取某个数据
    扩展方法
    base和this关键字
    装箱和拆箱
    var,object和dynamic
    const和readonly
    react native回调函数刷新页面
    react native打包android,android9.0以上版本http请求不了怎么办?
    react native中android app怎样打包发布
    React Native 实现页面返回监听
  • 原文地址:https://www.cnblogs.com/qscqesze/p/4322246.html
Copyright © 2011-2022 走看看