ZOJ-3593 One Person Game 扩欧
Posted xxrll
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
以上是关于ZOJ-3593 One Person Game 扩欧的主要内容,如果未能解决你的问题,请参考以下文章