zoukankan      html  css  js  c++  java
  • hdoj4180

    题意:
    使(a/b-c/d)最小,然后让你求c/d.
    我们能说最小the error |A/B - C/D|
    然后C,D的范围是 0 < C < D < B。
    其实就是:求接近(A/B)分数的最大分数
    思路:
    因为是神队友搞得exgcd专题,所以往这方面想想。
    我们先把那个减式通分得:(AD-BC)/BD;求这个最小

    若A,B有最大公约数不是1,则化简就是答案。
    若最大公约数为1,那么(分子)AD-BC=1,即求AX-BY=1或 -AX+BY=1。

    那么把X,Y算出来,比较一下分母就好了。后面自己推咯,很简单的。

    #include <stdio.h>
    #include <string.h>
    #include <math.h>
    #include <algorithm>
    #include <iostream>
    using namespace std;
    #define LL __int64
    #define mod 9973
    #define N 100010
    
    
    LL exgcd(LL a,LL b,LL &x,LL &y)
    {
        if(b==0)
        {
            x=1;
            y=0;
            return a;   
        }
        LL ans=exgcd(b,a%b,x,y);
        LL temp=x;
        x=y;
        y=temp-a/b*y;
        return ans;
    }
    
    int main()
    {
        int T;
        scanf("%d",&T);
        while(T--)
        {
            LL a,b,x,y;
            scanf("%I64d/%I64d",&a,&b);
            LL d=exgcd(a,b,x,y);
            if(d!=1)
            {
                printf("%I64d/%I64d
    ",a/d,b/d);
                continue;
            }
            if(a==1)
            {
                printf("1/%I64d
    ",b-1);
                continue;
            }
            LL d1=(x+b)%b;
            LL c1=(-y+a)%a;
            LL d2=(-x+b)%b;
            LL c2=(y+a)%a;
            if(d2>d1)
            {
                printf("%I64d/%I64d
    ",c2,d2);
            }
            else
            {
                printf("%I64d/%I64d
    ",c1,d1);
            }
    
        } 
    }
  • 相关阅读:
    Intelligence System
    Hawk-and-Chicken
    The Stable Marriage Problem
    HDU 1173 采矿
    HDU 1018 Big Number 斯特林公式
    HDU 1005 Number Sequence
    ZOJ-3941 Kpop Music Party
    Codeforces 939 D Love Rescue
    Codefroces 939 C Convenient For Everybody
    Codeforces 935 C Fifa and Fafa
  • 原文地址:https://www.cnblogs.com/keyboarder-zsq/p/5934514.html
Copyright © 2011-2022 走看看