zoukankan      html  css  js  c++  java
  • poj1061青蛙的约会解题报告

    由题意可知:y+nt-(x+mt)=dL ————> y-x=dL+(m-n)t

    则此方程可用扩展欧几里得算法求解

    因为ax+by=d的答案不唯一,当x增加b,y减少a,和不变。

    /************************/

    转帖一个关于扩展欧几里得算法的讲解

    扩展欧几里得算法------求解线性方程ax+by=c

    1.应用:
          线性方程ax+by=c ,已知a,b,c,求解x,y.

    2.基本思路:
        
          ax+by=c有解 => c=k*gcd(a,b)=kd(因为d=gcd(a,b)=>d|(ax+by))
          
          我们先考虑求解  ax+by=d
            由欧几里得算法,d=bx'+(a mod b)y'=bx'+(a-[a/b]b)y'=ay'+b(x'-[a/b])y'    
            则由上述两式子,我们可以得出 x=y' ,y=x'-[a/b]y'
            这样子,在欧几里得算法添加x,y变量,最后得到解。(可结合下面代码源代码进行理解)

          接下来我们来看看ax'+by'=d和ax+by=c之间的关系
          
            (c/d)ax'+(c/d)by'=(c/d)d 即 可以得到 x=(c/d)x',y=(c/d)y'
             
             所以可以得到ax+by的一组解
             那么ax+by=c所有解的形式是什么呢?
                 a(x+qb)+b(y-qa)=c; q为任意整数
    (注意,当要求y-qa的最小正整数min时,由y-qa>=0, q取[y/a]最小,min=y-[y/a]y,但是,[y/a]可能为0,如果y是负数,min此时也为负数,不好,此时令min+=a就可以取得最小正整数值了([y/a]=0所以|y|<a),这段可以自己找个例子好好理解下啊)

    3.源代码模板

    int Extended_Euclid(int a,int b,int& x,int &y)
    {
        
    if(b==0){
            x
    =1;
            y
    =0;
            
    return a;
        }
        
    int d=Extended_Euclid(b,a%b,x,y);
        
    int temp=x;x=y;y=temp-a/b*y;
        
    return d;
    }
    //用扩展欧几里得算法解线性方程ax+by=c;
    bool linearEquation(int a,int b,int c,int& x,int &y)
    {
        
    int d=Extended_Euclid(a,b,x,y);
        
    if(c%d) return false;

        
    int k=c/d;
        x
    *=k;y*=k;//求的只是其中一个解
        return true;
    }



    注意,其中扩展欧几里得算法的返回值还是gcd,

    /************************/

    AC代码如下:

    代码
     1 #include <stdio.h>
     2 long long  mod(long long a,long long  b)
     3 {
     4     return (a%b+b)%b;
     5 }
     6 long long exten_gcd(long a,long b,long long *x,long long *y)
     7 {
     8     long long r,t;
     9     if (b==0)     
    10     {
    11         r=a;*x=1;*y=0;
    12     }
    13     else 
    14     {
    15         r=exten_gcd(b,mod(a,b),x,y);
    16         t=*x;*x=*y;*y=t-(a/b)**y;
    17     }
    18     return r;
    19 }
    20 main()
    21 {
    22     long x,y,m,n,l;
    23     long long rx,ry,t,d;
    24     scanf("%d%d%d%d%d",&x,&y,&m,&n,&l);    
    25     d=exten_gcd(m-n,l,&rx,&ry);
    26     if (mod(y-x,d)) printf("Impossible\n");
    27     else
    28     {
    29         rx*=(y-x)/d;
    30         printf("%lld\n",mod(rx,l));
    31     }
    32     return 0;
    33 }
    34 
  • 相关阅读:
    HashMap,Hashtable,ConcurrentHashMap 和 synchronized Map 的原理和区别
    Collections.synchronizedMap()与ConcurrentHashMap的区别
    hashcode、equals和 ==详解
    Redis使用总结(二、缓存和数据库双写一致性问题)
    解决vue多个路由共用一个页面的问题
    RESTFUL API 安全认证方式
    Spring Bean详细讲解
    关于slf4j log4j log4j2的jar包配合使用的那些事
    slf4j、jcl、jul、log4j1、log4j2、logback大总结[转]
    经过测试,feign只能通过@RequestBody传对象参数
  • 原文地址:https://www.cnblogs.com/waterfalleagle/p/1918251.html
Copyright © 2011-2022 走看看