#include <vector>
#include <list>
#include <map>
#include <set>
#include <queue>
#include <deque>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <ctime>
using namespace std;
typedef long long lld;
const int MAXN = 1e5 + 10;
const lld MOD = 1e9 + 7;
const lld INF = 1e15;
struct P{
lld x, y;
P(lld _x = 0, lld _y = 0) : x(_x), y(_y) {}
bool operator < (const P& rhs) const
{
if(x != rhs.x) return x < rhs.x;
return y < rhs.y;
}
};
P p[MAXN];
vector<P> np;
bool ok(lld k, int M)
{
int s = 1;
int q = 0;
int j = 0;
for(int i = 0; i < np.size(); ++i){
if(i < q) continue;
j = i;
while(j + 1 < np.size() && np[i].y <= np[j + 1].y + k){
++j;
}
if(j + 1 == np.size()) break;
for(q = j; q < np.size(); ++q){
if(np[q].x > np[j].x + k) break;
}
if(q == np.size()) break;
++s;
}
return s <= M;
}
class TheEmpireStrikesBack {
public:
int find(int AX, int BX, int CX, int AY, int BY, int CY, int N, int M) {
p[0].x = AX;
p[0].y = AY;
for(int i = 1; i < N; ++i){
p[i].x = ((1LL * p[i - 1].x * BX) + CX) % MOD;
p[i].y = ((1LL * p[i - 1].y * BY) + CY) % MOD;
}
sort(p, p + N);
for(int i = 0; i < N; ++i){
while(!np.empty() && np.back().x <= p[i].x && np.back().y <= p[i].y){
np.pop_back();
}
np.push_back(p[i]);
}
lld l = 0;
lld r = INF;
while(l < r){
lld mid = (l + r) >> 1;
if(ok(mid, M)){
r = mid;
}else{
l = mid + 1;
}
}
return l;
}
};
<%:testing-code%>
//Powered by KawigiEdit 2.1.4 (beta) modified by pivanof!
I2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPGxpc3Q+CiNpbmNsdWRlIDxtYXA+CiNpbmNsdWRlIDxzZXQ+CiNpbmNsdWRlIDxxdWV1ZT4KI2luY2x1ZGUgPGRlcXVlPgojaW5jbHVkZSA8c3RhY2s+CiNpbmNsdWRlIDxiaXRzZXQ+CiNpbmNsdWRlIDxhbGdvcml0aG0+CiNpbmNsdWRlIDxmdW5jdGlvbmFsPgojaW5jbHVkZSA8bnVtZXJpYz4KI2luY2x1ZGUgPHV0aWxpdHk+CiNpbmNsdWRlIDxzc3RyZWFtPgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDxpb21hbmlwPgojaW5jbHVkZSA8Y3N0ZGlvPgojaW5jbHVkZSA8Y21hdGg+CiNpbmNsdWRlIDxjc3RkbGliPgojaW5jbHVkZSA8Y3RpbWU+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnR5cGVkZWYgbG9uZyBsb25nIGxsZDsKY29uc3QgaW50IE1BWE4gPSAxZTUgKyAxMDsKY29uc3QgbGxkIE1PRCA9IDFlOSArIDc7CmNvbnN0IGxsZCBJTkYgPSAxZTE1OwoKc3RydWN0IFB7CglsbGQgeCwgeTsKCVAobGxkIF94ID0gMCwgbGxkIF95ID0gMCkgOiB4KF94KSwgeShfeSkge30KCWJvb2wgb3BlcmF0b3IgPCAoY29uc3QgUCYgcmhzKSBjb25zdAoJewoJCWlmKHggIT0gcmhzLngpIHJldHVybiB4IDwgcmhzLng7CgkJcmV0dXJuIHkgPCByaHMueTsKCX0KfTsKClAgcFtNQVhOXTsKdmVjdG9yPFA+IG5wOwoKYm9vbCBvayhsbGQgaywgaW50IE0pCnsKCWludCBzID0gMTsKCWludCBxID0gMDsKCWludCBqID0gMDsKCWZvcihpbnQgaSA9IDA7IGkgPCBucC5zaXplKCk7ICsraSl7CgkJaWYoaSA8IHEpIGNvbnRpbnVlOwoJCWogPSBpOwoJCXdoaWxlKGogKyAxIDwgbnAuc2l6ZSgpICYmIG5wW2ldLnkgPD0gbnBbaiArIDFdLnkgKyBrKXsKCQkJKytqOwoJCX0KCQlpZihqICsgMSA9PSBucC5zaXplKCkpIGJyZWFrOwoJCWZvcihxID0gajsgcSA8IG5wLnNpemUoKTsgKytxKXsKCQkJaWYobnBbcV0ueCA+IG5wW2pdLnggKyBrKSBicmVhazsKCQl9CgkJCgkJaWYocSA9PSBucC5zaXplKCkpIGJyZWFrOwoJCSsrczsKCX0KCXJldHVybiBzIDw9IE07Cn0KCmNsYXNzIFRoZUVtcGlyZVN0cmlrZXNCYWNrIHsKcHVibGljOgoJaW50IGZpbmQoaW50IEFYLCBpbnQgQlgsIGludCBDWCwgaW50IEFZLCBpbnQgQlksIGludCBDWSwgaW50IE4sIGludCBNKSB7CgkJcFswXS54ID0gQVg7CgkJcFswXS55ID0gQVk7CgkJZm9yKGludCBpID0gMTsgaSA8IE47ICsraSl7CgkJCXBbaV0ueCA9ICgoMUxMICogcFtpIC0gMV0ueCAqIEJYKSArIENYKSAlIE1PRDsKCQkJcFtpXS55ID0gKCgxTEwgKiBwW2kgLSAxXS55ICogQlkpICsgQ1kpICUgTU9EOwoJCX0KCQlzb3J0KHAsIHAgKyBOKTsKCQkKCQlmb3IoaW50IGkgPSAwOyBpIDwgTjsgKytpKXsKCQkJd2hpbGUoIW5wLmVtcHR5KCkgJiYgbnAuYmFjaygpLnggPD0gcFtpXS54ICYmIG5wLmJhY2soKS55IDw9IHBbaV0ueSl7CgkJCQlucC5wb3BfYmFjaygpOwoJCQl9CgkJCW5wLnB1c2hfYmFjayhwW2ldKTsKCQl9CgkJCgkJbGxkIGwgPSAwOwoJCWxsZCByID0gSU5GOwoJCXdoaWxlKGwgPCByKXsKCQkJbGxkIG1pZCA9IChsICsgcikgPj4gMTsKCQkJaWYob2sobWlkLCBNKSl7CgkJCQlyID0gbWlkOwkKCQkJfWVsc2V7CgkJCQlsID0gbWlkICsgMTsKCQkJfQoJCX0KCQlyZXR1cm4gbDsKCX0KfTsKCgo8JTp0ZXN0aW5nLWNvZGUlPgovL1Bvd2VyZWQgYnkgS2F3aWdpRWRpdCAyLjEuNCAoYmV0YSkgbW9kaWZpZWQgYnkgcGl2YW5vZiE=