zoukankan      html  css  js  c++  java
  • uoj problem 12 猜数

    题目大意

    每次询问给出g,l,有(a*b = g*l = n),且(a,b)均为(g)的倍数.求(a+b)的最小值和(a-b)的最大值.

    题解

    因为(a,b)均为(g)的倍数,所以我们另(a = k_1*g,b = k_2*g)那么我们有:
    (a*b = k_1*k_2*g^2 = g*l)(k_1*k_2 = frac{l}{g})
    并且我们有(a+b = (k_1+k_2)*g)所以我们发现
    (a+b)的最小值在(k_1 = k_2)时取到,(a+b)的最大值在(k_1 = 1,k_2 = g)时取到.
    化简一下就会发现最大值其实就是(g+l)

    #include <cmath>
    #include <cstdio>
    using namespace std;
    int main(){
        int T;scanf("%d",&T);
        long long g,l;
        while(T--){
    	scanf("%lld%lld",&g,&l);
    	printf("%lld %lld
    ",2*(long long)sqrt(l/g)*g,g+l);
        }return 0;
    }
    
    
  • 相关阅读:
    树状数组
    线段树
    最短路(FLOYD)
    欧拉函数
    筛素数
    并查集
    背包方案数问题(礼物)
    [BeijingWc2008]雷涛的小猫
    受欢迎的牛[HAOI2006]
    删除物品[JLOI2013]
  • 原文地址:https://www.cnblogs.com/Skyminer/p/6636856.html
Copyright © 2011-2022 走看看