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 
用的函数名是crt,就当串片场了~~

 

以上是关于ZOJ-3593 One Person Game 扩欧的主要内容,如果未能解决你的问题,请参考以下文章

One Person Game(扩展欧几里得)

[ZOJ 3329] One Person Game

ZOJ3329 One Person Game

ZOJ3329One Person Game

ZOJ-3329 One Person Game (有环期望问题)

ZOJ 3329:One Person Game 概率DP求期望(有环)