ZOJ-3593 One Person Game --- 扩欧

👩‍💼

思路:最小是交点的那个±1小区间里,是真的没想到😭。这题我觉得关键是考虑c,即a+b,因为c的存在,a和b不可能同号,因为步数最少嘛。但我们用a和b,但是在同号时取两者中|最大|,即|a+b| + |最大|的剩余部分,异号就全取。

//被坑惨了,找了一个多小时的bug,竟然错在lld上o( ̄┰ ̄*)ゞ

 1 #include<bits/stdc++.h>
 2 #include<iostream>
 3 #include<stack>
 4 #include<algorithm>
 5 #include<cstdio>
 6 #include<cmath>
 7 #include<cstring>
 8 #define mem(a) memset(a,0,sizeof(a))
 9 #define mem1(a) memset(a,-1,sizeof(a))
10 #define fio ios::sync_with_stdio(false);cin.tie(0)
11 #define ll long long
12 #define mp make_pair
13 #define inf 0x3f3f3f3f
14 const int N=1e5+5;
15 const int M=1e3+10;
16 const int mod=9973;
17 using namespace std;
18 ll n,l,r,a,b;
19 inline void ex_gcd(ll a,ll b,ll &g,ll &x,ll &y)
20 {
21     if(!b)
22     {
23         x=1;
24         y=0;
25         g=a;
26         return;
27     }
28     else
29     {
30         ex_gcd(b,a%b,g,y,x);
31         y-=x*(a/b);
32     }
33 }
34 inline ll crt()
35 {
36     ll x,y,g,t,ans=1e15;
37     ex_gcd(a,b,g,x,y);
38     if((r-l)%g) return -1;
39     t=(r-l)/g;
40     x*=t,y*=t;
41     a/=g,b/=g;
42     ll k=(y-x)/(a+b);
43     for(ll i=k-1;i<=k+1;i++)
44     {
45         ll tl=x+b*i,tr=y-a*i;
46         if(tl*tr>=0) ans=min(max(abs(tl),abs(tr)),ans);
47         else ans=min(ans,abs(tl)+abs(tr));
48     }
49     return ans;
50 }
51 int main()
52 {
53     int t;
54     cin>>t;
55     while(t--)
56     {
57         cin>>l>>r>>a>>b;
58         cout<<crt()<<endl;
59     }
60     return 0;
61 }
用的函数名是crt,就当串片场了~~

 

posted @ 2019-07-23 09:03  XXrl  阅读(150)  评论(0编辑  收藏  举报