POJ 1061 青蛙的约会 | 同余方程和exGcd

题解:

要求s+px=t+qx (mod L)

移项 (p-q)x=t-s (mod L)

等价于 (p-q)x+Ly=t-s

即ax+by=c的方程最小非负根

exGcd后乘个C

 1 #include<cstdio>
 2 typedef long long ll;
 3 using namespace std;
 4 ll s,t,p,q,L;
 5 ll gcd (ll x,ll y)
 6 {
 7     return y==0?x:gcd(y,x%y);
 8 }
 9 ll exGcd(ll a,ll b,ll &x,ll &y)
10 {
11     if (b==0) return x=1,y=0,a;
12     ll r=exGcd(b,a%b,y,x);
13     y-=(a/b)*x;
14     return  r;
15 }
16 int main()
17 {
18     scanf("%lld%lld%lld%lld%lld",&s,&t,&p,&q,&L);
19     ll a=(p-q+L)%L,b=L,c=(t-s+L)%L,x,y,G=gcd(a,b);
20     if (c%G!=0)
21     {
22     puts("Impossible");
23     return 0;
24     }
25     a/=G,b/=G,c/=G;
26     exGcd(a,b,x,y);
27     x=(x%b+b)%b;
28     x=x*c%b;
29     printf("%lld\n",x);
30     return 0;
31 }

 

posted @ 2017-11-26 14:26  MSPqwq  阅读(157)  评论(0编辑  收藏  举报