template <typename T> inlinevoidread(T &num){ T x = 0, f = 1; char ch = getchar(); for (; ch > '9' || ch < '0'; ch = getchar()) if (ch == '-') f = -1; for (; ch <= '9' && ch >= '0'; ch = getchar()) x = (x << 3) + (x << 1) + (ch ^ '0'); num = x * f; }
const ll mod = 1000000007; char n[1000005], m[1000005]; ll N, M, _N, _M; ll a, b, c, d, nl, ml, am, asum, B, A, Am, Asum; ll ans;
inline ll fpow(ll x, ll t){ ll ret = 1; for (; t; t >>= 1, x = x * x % mod) if (t & 1) ret = ret * x % mod; return ret; }
intmain(){ scanf("%s %s", n + 1, m + 1); read(a); read(b); read(c); read(d); a %= mod; b %= mod; c %= mod; d %= mod; nl = strlen(n + 1); ml = strlen(m + 1); for (int i = 1; i <= ml; i++) { M = (M * 10 % mod + m[i] - '0') % mod; } for (int i = 1; i <= ml; i++) { _M = (_M * 10 % (mod-1) + m[i] - '0') % (mod-1); } for (int i = 1; i <= nl; i++) { N = (N * 10 % mod + n[i] - '0') % mod; } for (int i = 1; i <= nl; i++) { _N = (_N * 10 % (mod-1) + n[i] - '0') % (mod-1); } am = fpow(a, _M-1); //a^(p-1)==1 (mod p) if (a == 1) asum = M - 1; else asum = (am - 1) * fpow(a - 1, mod - 2) % mod; B = (b * c % mod * asum % mod + d) % mod; A = am * c % mod; Am = fpow(A, _N-1); if (A == 1) Asum = N - 1; else Asum = (Am - 1) * fpow(A - 1, mod - 2) % mod; ans = (Am + B * Asum % mod) % mod; // f[n][1] ans = (am * ans % mod + b * asum % mod) % mod; //f[n][n] printf("%lld\n", ans); return0; }