poj 1061 (解线性同余方程)

 

poj 1061 (解线性同余方程)

分类: 数论   86人阅读  评论(0)  收藏  举报
百度 ACM 编程 算法 数论

思路:列出公式:设跳了a次后相遇,则

(x+am)%L=(y+bn)%L

(a(m-n))%L=(y-x)%L

就是解同余方程a*c≡d(L);

解线性同于方程:

ax≡b (mod n)的方程。此方程有解当且仅当 b 能够被 a 与 n 的 最大公约数整除(记作 gcd(a,n) | b)。
在模 n 的完全剩余系 {0,1,…,n-1} 中,恰有 d 个解。

对于线性 同余方程
ax ≡ b (mod n)      (1)
若 d = gcd(a, n),d  整除 b ,那么b/d为整数。由 裴蜀定理,存在整数对 (r,s) (可用 辗转相除法求得)使得 ar+sn=d,因此 x0=rb/d是方程 (1) 的一个解。其他的解都关于n/d与 x 同余。即x≡x0+(n/d)*t (mod n)    (0≤t≤d-1)。
举例来说,方程
12x ≡ 20 (mod 28)
中 d = gcd(12,28) = 4 。注意到 4 = 12 *(-2)+28*1,因此 x0≡5*(-2)≡-10≡4(mod 7)是一个解。对模 28 来说,t=1,x≡4+(28/4)*1≡11 (mod 28);t=2,x≡4+(28/4)*2≡18 (mod 28);t=3,x≡4+(28/4)*3≡25 (mod 28)  。所有的解就是 {4,11,18,25} 。





[cpp]  view plain copy
  1. #include<stdio.h>  
  2. #include<string.h>  
  3. typedef __int64 LL;  
  4. LL x,y,m,n,L,q,x1,y1;  
  5. void  exgcd(LL a,LL b)    
  6. {    
  7.     if(b==0)    
  8.     {    
  9.         q=a;x1=1;y1=0;return;    
  10.     }    
  11.     else     
  12.     {    
  13.         exgcd(b,a%b);    
  14.         LL temp=x1;    
  15.         x1=y1;    
  16.         y1=temp-a/b*x1;    
  17.     }    
  18. }    
  19. int main()  
  20. {  
  21.     int i,j;  
  22.     LL a,b,c;  
  23.     while(scanf("%I64d%I64d%I64d%I64d%I64d",&x,&y,&m,&n,&L)!=-1)  
  24.     {  
  25.         b=m-n;c=y-x;  
  26.         exgcd(b,L);  
  27.         if(c%q!=0)  
  28.         {  
  29.             printf("Impossible\n");  
  30.             continue;  
  31.         }  
  32.         a=x1*c/q;  
  33.         a%=L;  
  34.         if(a<0)a+=L;//求出来的值可能为负数  
  35.         printf("%I64d\n",a);  
  36.     }  
  37.     return 0;  
  38. }  

你可能感兴趣的:(数论)