题目链接:
题目大意:
两个人,一个在坐标x,每天走m,一个在坐标y,每天走n,坐标长L,问几天后碰面。
题目思路:
【扩展欧几里德】
根据同余方程的ax+by=c,可以得出a=n-m,b=l,c=x-y 之后扩展欧几里得求线性同余方程。
题目数据较大需要使用long long
1 // 2 //by coolxxx 3 // 4 #include<iostream> 5 #include<algorithm> 6 #include<string> 7 #include<iomanip> 8 #include<memory.h> 9 #include<time.h> 10 #include<stdio.h> 11 #include<stdlib.h> 12 #include<string.h> 13 #include<stdbool.h> 14 #include<math.h> 15 #define min(a,b) ((a)<(b)?(a):(b)) 16 #define max(a,b) ((a)>(b)?(a):(b)) 17 #define abs(a) ((a)>0?(a):(-(a))) 18 #define lowbit(a) (a&(-a)) 19 #define sqr(a) (a)*(a) 20 #define swap(a,b) (a)^=(b),(b)^=(a),(a)^=(b) 21 #define eps 1e-8 22 #define MAX 0x7f7f7f7f 23 #define INF 20000 24 #define PI 3.1415926535897 25 #define N 100004 26 using namespace std; 27 int n,m,lll,ans,cas; 28 long long x,y,a,b,c,d; 29 long long exgcd(long long a,long long b) 30 { 31 if(!b) 32 { 33 x=1;y=0; 34 return a; 35 } 36 d=exgcd(b,a%b); 37 cas=x; 38 x=y; 39 y=cas-(a/b)*y; 40 return d; 41 } 42 int main() 43 { 44 #ifndef ONLINE_JUDGE 45 // freopen("1.txt","r",stdin); 46 // freopen("2.txt","w",stdout); 47 #endif 48 int i,j,k; 49 while(~scanf("%d",&n) && n) 50 { 51 x=n; 52 scanf("%lld%lld%lld%lld",&y,&m,&n,&b);//(n-m)X mod b = x-y; aX mod b = c 53 a=((m-n)%b+b)%b; 54 c=((y-x)%b+b)%b; 55 d=exgcd(a,b); 56 if(c%d!=0) 57 { 58 puts("Impossible"); 59 continue; 60 } 61 a/=d;b/=d;c/=d; 62 exgcd(a,b); 63 x=(x%b+b)%b; 64 x=(x*c)%b; 65 printf("%lld\n",x); 66 } 67 return 0; 68 } 69 70 71 /* 72 // 73 74 // 75 */
时间: 2024-10-03 01:29:19