P1516 青蛙的约会
拓展欧几里得。。好烦啊。。头晕得很。。
那还是简单说一下拓欧的基本原理。。
那么我们设a 和b 不全为0,则存在整数x,y,使得gcd(a,b)=xa+yb,对于辗转相除法的最后一项,此时b=0,则gcd(a,b)=1*a+0*b,因为gcd(a,b)=gcd(b,a%b),则有x*a+y*b=x1*b+y1*(a%b),将等式右边变形,b*x1+(a%b)*y1=b*x1+(a-(a/b)*b)*y1=a*y1+b*(x1-(a/b)*y1),则x=y1,y=x1-(a/b)*y1,则可由后向前迭代得到x,y
下面为实现代码
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 using namespace std; 5 6 long long ans,x1,y1,x,y,m,n,l,a,b; 7 8 long long ab(long long la){ 9 return la>0?la:-la; 10 } 11 12 int exgcd(long long a,long long b,long long &x1,long long &y1){ 13 if(!b){ 14 x1=1; 15 y1=0; 16 return a; 17 } 18 ans=exgcd(b,a%b,x1,y1); 19 long long t=x1; 20 x1=y1; 21 y1=t-a/b*y1; 22 return ans; 23 } 24 25 int main(){ 26 scanf("%lld%lld%lld%lld%lld",&x,&y,&m,&n,&l); 27 a=x-y; 28 b=n-m; 29 if(b<0){ 30 b=-b; 31 a=-a; 32 } 33 exgcd(b,l,x1,y1); 34 if(a%ans){ 35 printf("Impossible\n"); 36 } 37 else{ 38 printf("%lld\n",((x1*(a/ans))%(l/ans)+(l/ans))%(l/ans)); 39 } 40 return 0; 41 }
恩马上要下课了白白~~~