zoukankan      html  css  js  c++  java
  • P1516 青蛙的约会

    题面

    拓展欧几里得。。好烦啊。。头晕得很。。

    那还是简单说一下拓欧的基本原理。。

    那么我们设a 和b 不全为0,则存在整数x,y,使得gcd(a,b)=xa+yb,对于辗转相除法的最后一项,此时b=0,则gcd(a,b)=1*a+0*b,因为gcd(a,b)=gcd(b,a%b),则有x*a+y*b=x1*b+y1*(a%b),将等式右边变形,b*x1+(a%b)*y1=b*x1+(a-(a/b)*b)*y1=a*y1+b*(x1-(a/b)*y1),则x=y1,y=x1-(a/b)*y1,则可由后向前迭代得到x,y

    下面为实现代码

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<algorithm>
     4 using namespace std;
     5 
     6 long long ans,x1,y1,x,y,m,n,l,a,b;
     7 
     8 long long ab(long long la){
     9     return la>0?la:-la;
    10 }
    11 
    12 int exgcd(long long a,long long b,long long &x1,long long &y1){
    13     if(!b){
    14         x1=1;
    15         y1=0;
    16         return a;
    17     }
    18     ans=exgcd(b,a%b,x1,y1);
    19     long long t=x1;
    20     x1=y1;
    21     y1=t-a/b*y1;
    22     return ans;
    23 }
    24 
    25 int main(){
    26     scanf("%lld%lld%lld%lld%lld",&x,&y,&m,&n,&l);
    27     a=x-y;
    28     b=n-m;
    29     if(b<0){
    30         b=-b;
    31         a=-a;
    32     }
    33     exgcd(b,l,x1,y1);
    34     if(a%ans){
    35         printf("Impossible
    ");
    36     }
    37     else{
    38         printf("%lld
    ",((x1*(a/ans))%(l/ans)+(l/ans))%(l/ans));
    39     }
    40     return 0;
    41 }

    恩马上要下课了白白~~~

  • 相关阅读:
    匈牙利算法自主总结
    luogu P2071 座位安排
    luogu P1613 跑路
    luogu P1250 种树
    luogu P1744 采购特价商品
    网络流
    其他图论
    组合计数
    小技巧
    矩阵&&高斯消元
  • 原文地址:https://www.cnblogs.com/hahaha2124652975/p/11158784.html
Copyright © 2011-2022 走看看