青蛙的约会

题目传送门

思路

我们可以列出一个方程:\(x+km≡y+kn(mod\ l)\)
我们转换一下:
\(l\mid x+km-y-kn\)
\(\Rightarrow lz=x+km-y-kn\)
\(\Rightarrow -x+y=lz+km-kn\)
\(\Rightarrow -x+y=lz+k(m-n)\)
我们设\(S=-x+y,W=m-n\)
所以原式可化为\(lz+kW=S\)
我们知道\(l,W,S\),就求出\(k\)
然后就求出最小解。

但我们使用扩展欧几里得算法的话是求出\(lz+kW=gcd(l,W)\)
所以我们要求最后结果的话,我们就要把结果\(\times\frac{S}{gcd(l,W)}\)

代码

#include <bits/stdc++.h>
using namespace std;
long long x,y,n,m,l,t;

pair<long long,long long> gcd(long long x,long long y) {
      if(!y) {
            t=x;
            return make_pair(1,0);
      }
      pair<long long,long long> ans=gcd(y,x%y);
      return make_pair(ans.second,ans.first-ans.second*(x/y));
}

int main() {
      scanf("%lld %lld %lld %lld %lld",&x,&y,&n,&m,&l);
      long long b=m-n,a=x-y;
      if(b<0) b=-b,a=-a;
      pair<int,int> ans=gcd(b,l);

      if(a%t!=0) printf("Impossible");
      else printf("%lld",((ans.first*(a/t))%(l/t)+(l/t))%(l/t));
      return 0;
}
posted @ 2020-10-25 15:33  凌曦月lx  阅读(60)  评论(0编辑  收藏  举报