zoukankan      html  css  js  c++  java
  • POJ 1061 青蛙的约会(扩展欧几里德)

    点我看题目

    题意 : 中文题不详述。

    思路 : 设经过s步后两青蛙相遇,则必满足(x+m*s)-(y+n*s) = K*L(k = 0,1,2....)

    变形得:(n-m)*s+K*L = x-y ;

    另a = n-m,b = L,c = x-y,则上式变为a*s+b*k = c。于是就变成了扩展欧几里德,求解不定方程,线性同余方程。只要上式存在整数解,则这两个青蛙能相遇,否则不能。

     1 #include <stdio.h>
     2 #include <string.h>
     3 #include <iostream>
     4 #include <math.h>
     5 
     6 using namespace std ;
     7 
     8 #define LL long long
     9 
    10 LL gcd(LL a,LL b)
    11 {
    12     return b == 0 ? a : gcd(b,a%b) ;
    13 }
    14 
    15 void exeulid(LL a,LL b,LL &m,LL &n)
    16 {
    17     if(b == 0){
    18         m = 1 ;
    19         n = 0 ;
    20         return  ;
    21     }
    22     exeulid(b,a%b,m,n) ;
    23     LL t  = m ;
    24     m = n ;
    25     n = t-a/b*n ;
    26 }
    27 
    28 int main()
    29 {
    30     LL x,y,l,a = 0,b,c,r,m,n,j1 = 0,j2= 0 ,t;
    31     while(~scanf("%lld %lld %lld %lld %lld",&x,&y,&m,&n,&l))
    32     {
    33         a = n-m ;
    34         b = l ;
    35         c = x-y ;
    36         r = gcd(a,b) ;
    37         if(c % r){
    38             printf("Impossible
    ") ;
    39             continue ;
    40         }
    41         a /= r ;
    42         b /= r ;
    43         c /= r ;
    44         exeulid(a,b,j1,j2) ;
    45         t = c*j1/b ;
    46         j1 = c*j1-t*b ;
    47         if(j1 < 0)
    48             if(b > 0)
    49             j1 += b ;
    50     printf("%lld
    ",j1) ;
    51     }
    52     return 0 ;
    53 }
    View Code
  • 相关阅读:
    南阳97
    南阳96
    南阳94
    南阳77
    南阳75
    南阳74
    南阳65
    一般图匹配
    466E
    hdu5057 分块处理,当数值大于数据范围时树状数组 真是巧 将大数据分为小数据来处理
  • 原文地址:https://www.cnblogs.com/luyingfeng/p/3646240.html
Copyright © 2011-2022 走看看