标签:
题目:
Description
Input
Output
Sample Input
1 2 3 4 5
Sample Output
4
题意很简单,就是要解方程x+m*t=y+n*t+k*L
其中k可以是任意整数,要求最小非负t
首先要明确,只要求出任何一个满足此方程的t,就可以表示出所有的t,也就得到了最小非负t。
现在只需要做一件事,求任意整数t和k,使得x-y=(n-m)*t+k*L
这个用拓展欧几里得算法就可以了。
代码:
#include<iostream> #include<stdio.h> using namespace std; long long x, y; long long gcd(long long a, long long b) { if (a == 0 || b == 0) { x = (b == 0); y = (a == 0); return a + b; } long long r; if (a < 0) { r = gcd(-a, b); x *= -1; return r; } if (b < 0) { r = gcd(a, -b); y *= -1; return r; } if (a >= b)r = gcd(a%b, b); else r = gcd(a, b%a); y -= a / b*x; x -= b / a*y; return r; } int main() { long long xx, yy, m, n, l; cin >> xx >> yy >> m >> n >> l; xx -= yy; n -= m; long long g = gcd(n, l); if (xx % g == 0)cout << (x*xx / g%l + l) % (l / g) << endl; else cout << "Impossible" << endl; return 0; }
这个gcd是我自己写的,和一般人写的形式不太一样。
我写的代码比较多,不过效率是一样的,个人习惯不同吧。
一般人写的gcd,在递归的过程中,除了最开始第一次调用gcd之外,后面递归调用的gcd的参数都是有序的。
比如说保持a>=b,或者保持a<=b
不过我不喜欢这么写,我喜欢保留a和b在各自的位置不变,而不是频繁交换保持他们的序关系。
#include<iostream> #include<stdio.h> using namespace std; long long x, y; long long gcd(long long a, long long b) { if (a == 0 || b == 0) { x = (b == 0); y = (a == 0); return a + b; } long long r; if (a < 0) { r = gcd(-a, b); x *= -1; return r; } if (b < 0) { r = gcd(a, -b); y *= -1; return r; } if (a >= b)r = gcd(a%b, b); else r = gcd(a, b%a); y -= a / b*x; x -= b / a*y; return r; } int main() { long long xx, yy, m, n, l; cin >> xx >> yy >> m >> n >> l; xx -= yy; n -= m; long long g = gcd(n, l); if (xx % g == 0)cout << (x*xx / g%l + l) % (l / g) << endl; else cout << "Impossible" << endl; return 0; }
标签:
原文地址:http://blog.csdn.net/nameofcsdn/article/details/52252228