import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.math.BigInteger; import java.util.ArrayList; public class Barrels { public static Long myPow(Long a, Long b) { Long base = a; for (long i = 1; i < b; i++) { a *= base; } return a; } public static int count; public static Long a, b, c, k; public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String s; int line = 1; while ((s = br.readLine()) != null) { //System.out.println(s); String[] numbers = s.split(" "); a = Long.parseLong(numbers[0]); b = Long.parseLong(numbers[1]); k = Long.parseLong(numbers[2]); c = Long.parseLong(numbers[3]); } ArrayList numbers = new ArrayList<>(); numbers.add(a); numbers.add(b); Long newNumber; System.out.println(((myPow(new Long(2), new Long(k)) * k) / 2) % 1000000007); /* int count = 0; for (Long i = new Long(0); i < k - 1; i++) { ArrayList oldNumbers = new ArrayList<>(numbers); int oldSize = numbers.size(); for (int j = 0; j < oldSize; j++) { newNumber = numbers.get(j) + myPow(new Long(10), i + 1) * a; if(c == a) { count++; } numbers.set(j, newNumber); } for (int j = oldSize; j < oldSize * 2; j++) { newNumber = oldNumbers.get(j - oldSize) + myPow(new Long(10), i + 1) * b; if(c == b) { count++; } numbers.add(newNumber); } } StringBuilder sb = new StringBuilder(); for (long l : numbers) { sb.append(l); } System.out.println(sb.toString().length() / 2); */ } }