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 }

恩马上要下课了白白~~~

 

posted @ 2019-07-15 12:25  喵呜,颜儿ღ  阅读(105)  评论(0编辑  收藏  举报