zoukankan      html  css  js  c++  java
  • POJ1061 青蛙的约会(线性同余方程)

    线性同余方程$ ax equiv b pmod n$可以用扩展欧几里得算法求解。

    这一题假设青蛙们跳t次后相遇,则可列方程:

    $$ Mt+X equiv Nt+Y pmod L$$ $$ (M-N)t equiv Y-X pmod L$$

    于是就构造出一个线性同余方程,即可对t求解,解出最小非负整数解。

     1 #include<cstdio>
     2 #include<cstring>
     3 using namespace std;
     4 #define mod(x,y) (((x)%(y)+(y))%(y))
     5 #define lld long long
     6 //a*x+b*y=gcd(a,b)
     7 lld exgcd(lld a,lld b,lld &x,lld &y){
     8     if(b==0){
     9         x=1; y=0;
    10         return a;
    11     }
    12     lld d=exgcd(b,mod(a,b),x,y);
    13     lld t=y;
    14     y=x-a/b*y;
    15     x=t;
    16     return d;
    17 }
    18 //ax¡Ôb (mod n)
    19 lld MLES(lld a,lld b,lld n){
    20     lld x,y;
    21     lld d=exgcd(a,n,x,y);
    22     if(b%d) return -1;
    23     return mod(x*(b/d),n/d);
    24 }
    25 
    26 int main(){
    27     lld x,y,m,n,l;
    28     scanf("%lld%lld%lld%lld%lld",&x,&y,&m,&n,&l);
    29     lld res=MLES(m-n,y-x,l);
    30     if(res==-1) puts("Impossible");
    31     else printf("%lld",res);
    32     return 0;
    33 }
  • 相关阅读:
    星空雅梦
    星空雅梦
    星空雅梦
    星空雅梦
    星空雅梦
    星空雅梦
    星空雅梦
    星空雅梦
    星空雅梦
    C语言基础知识【作用域规则】
  • 原文地址:https://www.cnblogs.com/WABoss/p/5179995.html
Copyright © 2011-2022 走看看