【扩展欧几里德】Vijos P1009 清帝之惑之康熙

题目链接:

  https://vijos.org/p/1009

题目大意

  两个人,一个在坐标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 */
View Code

 

posted @ 2016-04-02 19:37  Cool639zhu  阅读(411)  评论(0编辑  收藏  举报