#include <iostream>
#include <cmath>
using namespace std;
const long long prime = 1000000007;

long long myPow(int x, int n)
{
    long long out=1;
    for(int i = 0; i < n; i++)
    {
        out=(out*x)%prime;
    }
    return out;

}

int main()
{
    long long a,b,k,c, out = 0;
    cin>>a>>b>>k>>c;
    if (a==b && a==c)
        out=k*2;
    else if(a==c || b==c)
    {
        out = (myPow(2, k-1)*k)%prime;
    }
    cout<<out<<endl;

    return 0;
}

/*
#include <iostream>
#include <cmath>

#define skocNaRiadokPyco goto
#define akTotoPlatiTakSpravHento if
#define zvacsiCiselkoOJedna ++
#define akSaRovna ==
#define vratSpatSpravnyVysledokTedaDufamZeSpravnyAkNieTakToNebudeFungovat return
#define vytlacNaToCierneOkienkoCoSaOtvaraKedToSpustim cout
#define dakujem endl
#define takeNormalneCislo int
#define dlhsieCisloAkoTakeToNormalneCislo long
#define konst const
#define nacitajToCoJozoNapiseDoCiernehoOkienka cin

using namespace std;
konst dlhsieCisloAkoTakeToNormalneCislo dlhsieCisloAkoTakeToNormalneCislo prime = 1000000007;

dlhsieCisloAkoTakeToNormalneCislo dlhsieCisloAkoTakeToNormalneCislo myPow(takeNormalneCislo x, takeNormalneCislo n)
{
    takeNormalneCislo i = 0;
    dlhsieCisloAkoTakeToNormalneCislo dlhsieCisloAkoTakeToNormalneCislo out=1;
    zaciatok:
    out=(out*x)%prime;
    i zvacsiCiselkoOJedna;
    akTotoPlatiTakSpravHento(i<n)
        skocNaRiadokPyco zaciatok;
    vratSpatSpravnyVysledokTedaDufamZeSpravnyAkNieTakToNebudeFungovat out;

}

takeNormalneCislo main()
{
    dlhsieCisloAkoTakeToNormalneCislo dlhsieCisloAkoTakeToNormalneCislo a,b,k,c, out = 0;
    nacitajToCoJozoNapiseDoCiernehoOkienka>>a>>b>>k>>c;
    akTotoPlatiTakSpravHento(a akSaRovna c || b akSaRovna c)
    {
        out = (myPow(2, k-1)*k)%prime;
    }
    akTotoPlatiTakSpravHento(a akSaRovna b && a akSaRovna c)
        out=k*2;
    vytlacNaToCierneOkienkoCoSaOtvaraKedToSpustim<<out<<dakujem;

    vratSpatSpravnyVysledokTedaDufamZeSpravnyAkNieTakToNebudeFungovat 0;
}
*/