#include typedef long long ll; /* TODO */ #if 0 #define dpf(x) printf x #else #define dpf(x) (void)0 #endif #define dp dpf ll euclid(ll d, ll dd, ll *p, ll *q) { ll x, y, xx, yy; x = 1; xx = 0; y = 0; yy = 1; do { if (d > dd) { x -= xx * (d/dd); y -= yy * (d/dd); d %= dd; } else { xx -= x * (dd/d); yy -= y * (dd/d); dd %= d; } } while (d != 0 && dd != 0); if (d == 0) { if (p) *p = x; if (q) *q = y; d = dd; } else { if (p) *p = xx; if (q) *q = yy; } /* if (d == 0) { if (p) *p = xx; if (q) *q = yy; d = dd; } else { if (p) *p = x; if (q) *q = y; } */ return d; } ll inverse(ll x, ll m) { euclid(x,m,&x,NULL); if (x < 0) x += m; return x; } ll div(ll a, ll b, ll m) { ll x; ll inv; if (b == 1) return a % m; inv = inverse(b,m); dp(("inv %lld %lld = %lld\n",b,m,inv)); x = (a*inv)%m; if (!x) x = a/b; return x; } int main(void) { ll a, b, c, k,m ,u,v; while (1) { scanf("%lld%lld%lld%lld",&a,&b,&c,&k); if (a == 0 && b == 0 && c == 0 && k == 0) break; if (a == b) { puts("0"); continue; } if (!c) { puts("FOREVER"); continue; } m = 1ll << k; u = (b - a + m) % m; v = div(u,c,m); dpf(("uv: %lld %lld %lld\n", u , v,m )); if ((v * c) % m != u) puts("FOREVER"); else printf("%lld\n",v); } return 0; }