分析:这个东西在数论里面应该叫做不定方程式,可以搜一下,有很精彩的证明,先求出来方程式的一组特解,然后用这组特解来求通解,但是求出来特解之后怎么求这些解里面的最小非负x值?我们知道 x = x0 + bt, 假设x=0, 也就是最小值, 那么 t = x0/(-b), x0+x0/(-b)*b就是最小值了,当然如果结果是负的加上一个b即可。
代码如下:
================================================================================================================================
#include<stdio.h> #include<string.h> #include<algorithm> #include<iostream> using namespace std; const int MAXN = 107; const int oo = 1e9+7; typedef long long LL; LL ExGcd(LL a, LL b, LL &x0, LL &y0) { if(b == 0) { x0 = 1, y0 = 0; return a; } LL d = ExGcd(b, a%b, x0, y0); swap(x0, y0); y0 = y0 - a/b * x0;///原式是 y0 = x0 - a/b * y0; return d; } int main() { LL x1, x2, L1, L2, L; ///青蛙AB的起始位置x1,x2 ///青蛙AB每次跳跃的长度L1,L2 ///纬度总线长度L ///假设总共跳跃x次,那么青蛙A的跳跃长度是 x1 + x*L1 ///青蛙B的跳跃长度是x2 + x*L2 ///(x1+x*L1)-(x2+x*L2) = y*L ==> (L2-L1)*x+(L)*y = x1-x2; cin >> x1 >> x2 >> L1 >> L2 >> L; LL a = L2-L1, b = L, c = x1-x2, x0, y0; LL d = ExGcd(a, b, x0, y0); if(c % d) {///条件不符合 printf("Impossible "); return 0; } x0 = x0 * (c/d), y0 = y0 * (c/d); a /= d, b /= d; LL x = x0+x0/(-b)*b; if(x < 0)x += b; cout << x <<endl; return 0; }