2019牛客国庆集训派对day4 I Strange Optimization(Math - exgcd)

链接:https://ac.nowcoder.com/acm/contest/1109/I
来源:2019牛客国庆集训派对day4

  • 题目描述在这里插入图片描述
  • 输入描述:
    The input contains zero or more test cases and is terminated by end-of-file.
    Each test case contains two integers n, m.
    1 ≤ n , m ≤ 1 0 9 1≤n,m≤10^{9} 1n,m109
    The number of tests cases does not exceed 1 0 4 10^{4} 104.
  • 输出描述:
    For each case, output a fraction p/q which denotes the result.
  • 输入
    1 1
    1 2
  • 输出
    1/2
    1/4
  • 备注:
    For the first sample, α = 0 α=0 α=0 maximizes the function.

  题意 : : 最大化 f ( t ) = m i n i , j ∈ Z ∣ i / n − j / m + t ∣ f(t)=min_{i,j∈Z}|i/n-j/m+t| f(t)=mini,jZi/nj/m+t
  思路 : : f ( t ) = m i n i , j ∈ Z ∣ i / n − j / m + t ∣ = m i n i , j ∈ Z ∣ ( i ∗ m − j ∗ n ) / ( m ∗ n ) + t ∣ f(t)=min_{i,j∈Z}|i/n-j/m+t|=min_{i,j∈Z}|(i*m-j*n)/(m*n)+t| f(t)=mini,jZi/nj/m+t=mini,jZ(imjn)/(mn)+t,我们设 ( i ∗ m − j ∗ n ) = c (i*m-j*n) = c (imjn)=c 根据题意可知此方程式一定有解,那么就是 e c g c d ecgcd ecgcd 有解,所以 ( i ∗ m − j ∗ n ) = c = k ∗ g c d ( m ∗ n ) (i*m-j*n) = c=k*gcd(m*n) (imjn)=c=kgcd(mn),得到 f ( t ) = m i n i , j ∈ Z ∣ k ∗ g c d ( m , n ) / ( m ∗ n ) + t ∣ f(t)=min_{i,j∈Z}|k*gcd(m,n)/(m*n)+t| f(t)=mini,jZkgcd(m,n)/(mn)+t,我们找出两个点 X k = k ∗ g c d ( m , n ) / ( m ∗ n ) X_{k}=k*gcd(m,n)/(m*n) Xk=kgcd(m,n)/(mn)    X k + 1 = ( k + 1 ) ∗ g c d ( m , n ) / ( m ∗ n ) X_{k+1}=(k+1)*gcd(m,n)/(m*n) Xk+1=(k+1)gcd(m,n)/(mn),这两个点之间的距离为 X k + 1 − X k = g c d ( m , n ) / ( m ∗ n ) X_{k+1}-X_{k}=gcd(m,n)/(m*n) Xk+1Xk=gcd(m,n)/(mn),我们需要找到的答案就是 t t t 到这些点的距离哪一个最近并且是最大的。由上述分析可知 t t t 到上面两个点的中点才可以最大化 f ( t ) f(t) f(t)。即 t = g c d ( m , n ) / ( m ∗ n ) / 2 = 1 / 2 ∗ l c m ( m , n ) t=gcd(m,n)/(m*n)/2=1/2*lcm(m,n) t=gcd(m,n)/(mn)/2=1/2lcm(m,n)

#include<bits/stdc++.h>
using namespace std;

typedef long long ll;
const int Max_n=1e6+10;

int gcd(int a,int b){
    return b==0?a:gcd(b,a%b);
}

ll lcm(int a,int b){
    return 1ll*a*b/gcd(a,b);
}

int main(){
    int n,m;
    while(~scanf("%d%d",&n,&m)){
        printf("%d/%lld\n",1,2*lcm(n,m));
    }
    return 0;
}


/**
* Copyright(c)
* All rights reserved.
* Author : Max_n
* Date : 2019-10-05-16.42.31
* Description : exgcd 的应用
*/
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
牛客 a卷2022年第四季度的华为题目中,要求考生设计一种高效的数据结构,能够支持以下几种操作: 1. 添加一个元素 2. 删除一个元素 3. 查找是否存在某个元素 4. 返回元素的总数 该数据结构要求满足空间复杂度较小、时间复杂度较低、能够快速地进行查找和修改等多种操作。 想要编写这样一种数据结构,我们可以参考许多已有的经典算法与数据结构,如二叉树、哈希表、红黑树等,通过综合利用它们的优点来实现这个问题的解决。 例如,我们可以通过哈希表来存储所有元素的值,并在每个哈希链表的元素中再使用红黑树来进行排序与查找。这样,我们既能够轻松地进行元素的添加和删除操作,也能够在查找较大数据范围和数量时保持较高的速度与效率。同时,由于使用了多个数据结构来协同完成这个问题,我们也能够在空间复杂度上适度地进行优化。 当然,在具体设计这个数据结构的过程中,我们还需要考虑一些实践中的细节问题,例如如何避免哈希冲突、如何处理数据丢失与被删除元素所占用的空间等问题,这都需要相应的算法与流程来进行处理。 总体来看,设计这种支持多种操作的高效数据结构,需要我们具备丰富的算法知识和编程实践能力,同时需要我们在具体处理问题时能够将多种算法和数据结构进行有效地结合。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值