#include <iostream>
#include <iomanip> //cout.setprecision(), cout.fixed
#include <deque>
#include <stack>
#include <cmath> //floor()
#include <map>
using namespace std;
//НОД
long double gcd(long double a, long double b){
while(b){
a = a - b*floor(a/b);
swap(a, b);
}
return a;
}
//НОК
long double lcm(long double a, long double b){
return a*(b/gcd(a,b));
}
int main()
{
int S, M, H, K;
cin >> S >> M >> H >> K;
//инициализация очереди
deque<int> clock;
for(int i = 1; i <= K; i++)
clock.push_back(i);
//моделирование суточного цикла
stack<int> s, m, h;
while(h.size() != H){
s.push(clock.front()); //первый шарик очереди падает
clock.pop_front(); //на секундную чашу
if(s.size() == S){ //при переполнении чаши
m.push(s.top()); //последний упавший шарик
s.pop(); //переходит на минутную чашу
while(!s.empty()){ //остальные шарики
clock.push_back(s.top()); //переходят в конец очереди
s.pop(); //в обратном порядке
}
if(m.size() == M){ //аналогично при переполнении
h.push(m.top()); //минутной чаши
m.pop();
while(!m.empty()){
clock.push_back(m.top());
m.pop();
}
}
}
}
while(!h.empty()){
clock.push_back(h.top());
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.front();
clock.pop_front();
}
//разложение перестановки в композицию непересекающихся циклов
bool *used = new bool[K+1]; //метки на посещенных элементах
long double permutation_period = 1; //период перестановки
for(int i = 1; i <= K; i++){
if(!used[i]){ //если элемент не принадлежит ни одному из обследованных циклов
long double cycle_length = 1; //найти длину его цикла
for(size_t x = i; permutation[x] != i; x = permutation[x]){
used[x] = true;
cycle_length++;
}
//и воспользоваться тем, что порядок перестановки -
//произведение длин циклов из его разложения
permutation_period = lcm(permutation_period, cycle_length);
}
}
cout << setprecision(0) << fixed << permutation_period << endl;
return 0;
}