1 /*
2 POJ2115 C Looooops
3 http://poj.org/problem?id=2115
4 扩展欧几里得
5 题意:求x, s.t. (a+c*x)=b (mod 1<<k)
6 <=> c*x=b-a (mod 1<<k)
7 */
8 #include <cstdio>
9 #include <algorithm>
10 #include <cstring>
11 #include <cmath>
12 #include <vector>
13 #include <queue>
14 #include <iostream>
15 #include <map>
16 #include <set>
17 //#define test
18 using namespace std;
19 const int Nmax=1e6+7;
20 long long a,b,c,k,x,y;
21 long long ex_gcd(long long a,long long b,long long &x,long long &y)//solve x,y in a*x+b*y=ex_gcd(a,b,x,y)=gcd(a,b);
22 {
23 if(b==0)
24 {
25 x=1LL;
26 y=0LL;
27 return a;
28 }
29 long long ans=ex_gcd(b,a%b,x,y);
30 long long tmp=x;
31 x=y;
32 y=tmp-a/b*y;
33 return ans;
34 //x = x0 + (b/gcd)*t
35 //y = y0 – (a/gcd)*t
36
37 }
38 long long get(long long a,long long m,long long c)//get x in a*x=c(mod m)
39 {
40 //we can solve x,y in a*x+b*y=c <=> c%gcd(a,b)==0
41 long long x,y;
42 long long gcd=ex_gcd(a,m,x,y);
43 if(c%gcd!=0)
44 return -1;//error
45 m/=gcd;
46 x*=c/gcd;
47 if(m<0)
48 m=-m;
49 long long ans=x%m;
50 while(ans<0)
51 ans+=m;
52 return ans;
53 }
54
55
56 int main()
57 {
58 #ifdef test
59 #endif
60 //freopen("poj2115.in","r",stdin);
61 while(1)
62 {
63 scanf("%lld%lld%lld%lld",&a,&b,&c,&k);
64 if(!a&&!b&&!c&&!k)
65 break;
66 long long d=b-a;
67 //if(d<0)//即使是负数也不用考虑,可以得出正确答案
68 //d+=(1LL<<k);
69 long long ans=get(c,(1LL<<k),d);
70 if(ans==-1)
71 printf("FOREVER\n");
72 else
73 printf("%lld\n",ans);
74 }
75 return 0;
76 }