#include <bits/stdc++.h>
using namespace std;
#define int long long // câu thần chú :>
typedef long long ll;
/* Riêng ở bài này các em nhớ chú ý đến giới hạn của đề bài, các số đều <= 1e18.
Thì phép nhân 2 số trong trường hợp này rất nhạy cảm :<
Ví dụ như MOD = 1e18, thì phép nhân 2 số tuy đã áp dụng công thức vẫn có thể bị tràn
Ví dụ như a = b = 1e18 - 1, MOD = 1e18
thì a % MOD, b % MOD vẫn = 1e18 - 1, nên khi nhân lại thì ~ 1e36, trong khi long long tối đa chỉ có ~ 9e18.
nên ở bài này chúng ta sẽ viết lại hàm mul(a, b) bằng thuật toán sau (dùng ý tưởng tương tự như ở thuật tính a^b):
chính là ta sẽ phân tích b sang hệ nhị phân, b = 2^i0 + 2^i1 + 2^i2 + ... + 2^ik
thì a * b = a * (2^i0 + 2^i1 + 2^i2 + ... + 2^ik)
= a * 2^i0 + a * 2^i1 + a * 2^i2 + a * 2^ik
Ví dụ 3 * 5 = 3 * (101_2) = 3 * (2^2 + 2^0) = 3 * 2^2 + 3 * 2^0
Thì các em thấy rằng với việc này giống như ta phân rã b ra thành những b_i nhỏ hơn
để khi nhân a vào sẽ tránh được lỗi tràn số.
*/
ll MOD;
int mul(int a, int b) {
int ans = 0;
for (; b > 0; b >>= 1) {
if (b & 1) ans = (ans + a) % MOD;
a = (a + a) % MOD;
}
return ans;
}
int binpow(int a, int b) {
int ans = 1;
for (; b > 0; b >>= 1) {
if (b & 1) ans = mul(ans, a); // ans * a % MOD;
a = mul(a, a); // a * a % MOD;
}
return ans;
}
signed main() {
ios::sync_with_stdio(0); cin.tie(0);
ll x, y, n;
cin >> x >> y >> n >> MOD;
ll ans = binpow(x, n) - binpow(y, n);
ans = (ans + MOD) % MOD;
cout << ans << '\n';
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7IAoKI2RlZmluZSBpbnQgbG9uZyBsb25nIC8vIGPDonUgdGjhuqduIGNow7ogOj4KCnR5cGVkZWYgbG9uZyBsb25nIGxsOyAgIAoKLyogUmnDqm5nIOG7nyBiw6BpIG7DoHkgY8OhYyBlbSBuaOG7myBjaMO6IMO9IMSR4bq/biBnaeG7m2kgaOG6oW4gY+G7p2EgxJHhu4EgYsOgaSwgY8OhYyBz4buRIMSR4buBdSA8PSAxZTE4LgogICBUaMOsIHBow6lwIG5ow6JuIDIgc+G7kSB0cm9uZyB0csaw4budbmcgaOG7o3AgbsOgeSBy4bqldCBuaOG6oXkgY+G6o20gOjwKICAgVsOtIGThu6UgbmjGsCBNT0QgPSAxZTE4LCB0aMOsIHBow6lwIG5ow6JuIDIgc+G7kSB0dXkgxJHDoyDDoXAgZOG7pW5nIGPDtG5nIHRo4bupYyB24bqrbiBjw7MgdGjhu4MgYuG7iyB0csOgbiAKICAgVsOtIGThu6UgbmjGsCBhID0gYiA9IDFlMTggLSAxLCBNT0QgPSAxZTE4CiAgIHRow6wgYSAlIE1PRCwgYiAlIE1PRCB24bqrbiA9IDFlMTggLSAxLCBuw6puIGtoaSBuaMOibiBs4bqhaSB0aMOsIH4gMWUzNiwgdHJvbmcga2hpIGxvbmcgbG9uZyB04buRaSDEkWEgY2jhu4kgY8OzIH4gOWUxOC4KICAgbsOqbiDhu58gYsOgaSBuw6B5IGNow7puZyB0YSBz4bq9IHZp4bq/dCBs4bqhaSBow6BtIG11bChhLCBiKSBi4bqxbmcgdGh14bqtdCB0b8OhbiBzYXUgKGTDuW5nIMO9IHTGsOG7n25nIHTGsMahbmcgdOG7sSBuaMawIOG7nyB0aHXhuq10IHTDrW5oIGFeYik6IAogICBjaMOtbmggbMOgIHRhIHPhur0gcGjDom4gdMOtY2ggYiBzYW5nIGjhu4cgbmjhu4sgcGjDom4sIGIgPSAyXmkwICsgMl5pMSArIDJeaTIgKyAuLi4gKyAyXmlrIAogICB0aMOsIGEgKiBiID0gYSAqICgyXmkwICsgMl5pMSArIDJeaTIgKyAuLi4gKyAyXmlrKQogICAgICAgICAgICAgPSBhICogMl5pMCArIGEgKiAyXmkxICsgYSAqIDJeaTIgKyBhICogMl5payAgIAogICBWw60gZOG7pSAzICogNSA9IDMgKiAoMTAxXzIpID0gMyAqICgyXjIgKyAyXjApID0gMyAqIDJeMiArIDMgKiAyXjAgIAogICBUaMOsIGPDoWMgZW0gdGjhuqV5IHLhurFuZyB24bubaSB2aeG7h2MgbsOgeSBnaeG7kW5nIG5oxrAgdGEgcGjDom4gcsOjIGIgcmEgdGjDoG5oIG5o4buvbmcgYl9pIG5o4buPIGjGoW4gCiAgIMSR4buDIGtoaSBuaMOibiBhIHbDoG8gc+G6vSB0csOhbmggxJHGsOG7o2MgbOG7l2kgdHLDoG4gc+G7kS4gCiovCgpsbCBNT0Q7ICAgCgppbnQgbXVsKGludCBhLCBpbnQgYikgewogICAgaW50IGFucyA9IDA7ICAKICAgIGZvciAoOyBiID4gMDsgYiA+Pj0gMSkgewogICAgICAgIGlmIChiICYgMSkgYW5zID0gKGFucyArIGEpICUgTU9EOyAgCiAgICAgICAgYSA9IChhICsgYSkgJSBNT0Q7ICAKICAgIH0KICAgIHJldHVybiBhbnM7ICAKfQoKaW50IGJpbnBvdyhpbnQgYSwgaW50IGIpIHsKICAgIGludCBhbnMgPSAxOyAgCiAgICBmb3IgKDsgYiA+IDA7IGIgPj49IDEpIHsKICAgICAgICBpZiAoYiAmIDEpIGFucyA9IG11bChhbnMsIGEpOyAvLyBhbnMgKiBhICUgTU9EOyAgCiAgICAgICAgYSA9IG11bChhLCBhKTsgLy8gYSAqIGEgJSBNT0Q7IAogICAgfQogICAgcmV0dXJuIGFuczsgCn0KCnNpZ25lZCBtYWluKCkgewogICAgaW9zOjpzeW5jX3dpdGhfc3RkaW8oMCk7IGNpbi50aWUoMCk7IAogICAgbGwgeCwgeSwgbjsgIAogICAgY2luID4+IHggPj4geSA+PiBuID4+IE1PRDsgICAgCgogICAgbGwgYW5zID0gYmlucG93KHgsIG4pIC0gYmlucG93KHksIG4pOyAgICAgCiAgICBhbnMgPSAoYW5zICsgTU9EKSAlIE1PRDsgCgogICAgY291dCA8PCBhbnMgPDwgJ1xuJzsgICAKCiAgICByZXR1cm4gMDsgIAp9Cg==