import java.util.*;
import java.lang.*;
import java.io.*;
class Main
{
public static double gcd(double a, double b){
double temp;
while(b > 0){
a
= a
- b
*Math.
floor(a
/b
); temp = a;
a = b;
b = temp;
}
return a;
}
public static double lcm(double a, double b){
return a*(b/gcd(a,b));
}
{
int S, M, H, K;
Scanner in
= new Scanner
(System.
in); S = in.nextInt();
M = in.nextInt();
H = in.nextInt();
K = in.nextInt();
Deque<Integer> clock = new ArrayDeque<>();
for(int i = 1; i <= K; i++)
clock.addLast(i);
while(h.size() != H){
s.push(clock.getFirst()); //первый шарик очереди падает
clock.removeFirst(); //на секундную чашу
if(s.size() == S){ //при переполнении чаши
m.push(s.peek()); //последний упавший шарик
s.pop(); //переходит на минутную чашу
while(!s.empty()){ //остальные шарики
clock.
addLast((Integer)s.
peek()); //переходят в конец очереди s.pop(); //в обратном порядке
}
if(m.size() == M){ //аналогично при переполнении
h.push(m.peek()); //минутной чаши
m.pop();
while(!m.empty()){
m.pop();
}
}
}
}
while(!h.empty()){
h.pop();
}
/*суточная перестановка
1 2 3 4 5 6 ... K
a1 a2 a3 a4 a5 a6 ... ak*/
int[] permutation = new int[K + 1];
for(int i = 1; i <= K; i++){
permutation[i] = clock.getFirst();
clock.removeFirst();
}
//разложение перестановки в композицию непересекающихся циклов
boolean[] used = new boolean[K+1];
double permutationOrder = 1; //метки на посещенных элементах
for(int i = 1; i <= K; i++){ //порядок перестановки
if(!used[i]){ //если элемент не принадлежит ни одному из обследованных циклов
double cycleLength = 1; //найти длину его цикла
for(int x = i; permutation[x] != i; x = permutation[x]){
used[x] = true;
cycleLength++;
}
/*и воспользоваться тем, что порядок перестановки -
произведение длин циклов из его разложения*/
permutationOrder = lcm(permutationOrder, cycleLength);
}
}
}
}