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}
    The number of tests cases does not exceed 1 0 4 10^{4} .
  • 输出描述:
    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 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 ) = 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| ,我们设 ( i m j n ) = c (i*m-j*n) = c 根据题意可知此方程式一定有解,那么就是 e c g c d ecgcd 有解,所以 ( i m j n ) = c = k g c d ( m n ) (i*m-j*n) = c=k*gcd(m*n) ,得到 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| ,我们找出两个点 X k = k g c d ( m , n ) / ( m n ) X_{k}=k*gcd(m,n)/(m*n)    X k + 1 = ( k + 1 ) g c d ( m , n ) / ( m n ) X_{k+1}=(k+1)*gcd(m,n)/(m*n) ,这两个点之间的距离为 X k + 1 X k = g c d ( m , n ) / ( m n ) X_{k+1}-X_{k}=gcd(m,n)/(m*n) ,我们需要找到的答案就是 t t 到这些点的距离哪一个最近并且是最大的。由上述分析可知 t 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)

#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 的应用
*/
发布了166 篇原创文章 · 获赞 68 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_42217376/article/details/102157186