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