• UESTC 1722


     1 #include <iostream>
     2 #include <string.h>
     3 #include <string>
     4 #include <fstream>
     5 #include <algorithm>
     6 #include <stdio.h>
     7 #include <vector>
     8 #include <queue>
     9 #include <set>
    10 #include <cmath>
    11 using namespace std;
    12 const double eps = 1e-8;
    13 const double pi=acos(-1.0);
    14 const int INF=0x7fffffff;
    15 unsigned long long uINF = ~0LL;
    16 #define MAXN 1007
    17 #define mod 1000000007
    18 typedef long long LL;
    19 LL gcd(LL a,LL b)
    20 {
    21     return b==0?a:gcd(b,a%b);
    22 }
    23 //ax+by=d;
    24 void gcd(LL a,LL b,LL& d,LL& x,LL& y)
    25 {
    26     if(!b){d=a;x=1;y=0;}
    27     else {gcd(b,a%b,d,y,x);y-=x*(a/b);}
    28 }
    29 LL a,b,A,B,c,d,x,y;
    30 LL Find(LL i,LL j)
    31 {
    32     LL temp;
    33     if(i>=0&&j>=0)temp=max(i,j);
    34     else if(i<=0&&j<=0)temp=-min(i,j);
    35     else if(i>j)temp=i-j;
    36     else temp=j-i;
    37     //cout<<temp<<endl;
    38     if(temp)return temp;
    39     return INF;
    40 }
    41 int main()
    42 {
    43     int T;
    44     //freopen("0.in","r",stdin);
    45     scanf("%d",&T);
    46     while(T--)
    47     {
    48         scanf("%lld%lld%lld%lld",&A,&B,&a,&b);
    49         if(A>B)swap(A,B);
    50         c=B-A;
    51         gcd(a,b,d,x,y);
    52         if(c%d!=0)printf("-1
    ");
    53         else if(c==0)printf("0
    ");
    54         else
    55         {   x=x*(c/d);y=y*(c/d);
    56             a/=d;b/=d;c/=d;
    57             //cout<<x<<' '<<y<<endl;
    58             LL ans=INF;
    59             LL temp=c/(a+b);
    60             LL x1,y1,k1;
    61             k1=(temp-x)/b;y1=y+k1*a;x1=x-k1*b;
    62             //cout<<x1<<' '<<y1<<endl;
    63             LL x2,y2,k2;
    64             y2=y-k1*a;x2=x+k1*b;
    65             //cout<<x2<<' '<<y2<<endl;
    66 
    67             for(int i=0;i<=10;i++)
    68             {
    69                 ans=min(ans,Find(x1-b*i,y1+a*i));
    70                 ans=min(ans,Find(x2-b*i,y2+a*i));
    71                 ans=min(ans,Find(x1+b*i,y1-a*i));
    72                 ans=min(ans,Find(x2+b*i,y2-a*i));
    73             }
    74 
    75             printf("%lld
    ",ans);
    76         }
    77     }
    78 
    79     return 0;
    80 }

    扩展gcd

  • 相关阅读:
    /proc/interrupts 和 /proc/stat 查看中断的情况
    publish and submit
    camera shading比例
    高负载linux调优
    linux网络socket 接口转
    深入分析linux调度机制
    大型网站架构之分布式消息队列
    Linux下高并发socket最大连接数所受的各种限制(详解)
    Linux服务器高并发实践经历
    oracle: 分割字符串,或者查找字段里面的关键字(关键字1,关键字2,关键字3)
  • 原文地址:https://www.cnblogs.com/TO-Asia/p/3223884.html
Copyright © 2020-2023  润新知