#line 1 "B.cpp" // #pragma GCC target("avx2") // #pragma GCC optimize("O3") // #pragma GCC optimize("unroll-loops") #include using namespace std; using ll = long long; using ull = unsigned long long; template using pq = priority_queue; template using qp = priority_queue, greater>; #define vec(T, A, ...) vector A(__VA_ARGS__); #define vvec(T, A, h, ...) vector> A(h, vector(__VA_ARGS__)); #define vvvec(T, A, h1, h2, ...) vector>> A(h1, vector>(h2, vector(__VA_ARGS__))); #define endl "\n" #define spa ' ' #define len(A) A.size() #define all(A) begin(A), end(A) #define fori1(a) for(ll _ = 0; _ < (a); _++) #define fori2(i, a) for(ll i = 0; i < (a); i++) #define fori3(i, a, b) for(ll i = (a); i < (b); i++) #define fori4(i, a, b, c) for(ll i = (a); ((c) > 0 || i > (b)) && ((c) < 0 || i < (b)); i += (c)) #define overload4(a, b, c, d, e, ...) e #define fori(...) overload4(__VA_ARGS__, fori4, fori3, fori2, fori1)(__VA_ARGS__) #define enum1(A) fori(A.size()) #define enum2(a, A) for(auto a:A) #define enum3(i, a, A) for(ll i = 0, a = A[i]; i < A.size(); a = A[++i]) #define enum4(i, a, A, s) for(ll i = s, a = A[i - s]; i - s < A.size(); a = A[++i - s]) #define enum(...) overload4(__VA_ARGS__, enum4, enum3, enum2, enum1)(__VA_ARGS__) #define zip4(a, b, A, B) if(min(A.size(), B.size()) >= 1) for(ll _ = 0, a = A[_], b = B[_]; _ < min(A.size(), B.size()); a = A[++_], b = B[_]) #define enumzip5(i, a, b, A, B) if(min(A.size(), B.size()) >= 1) for(ll i = 0, a = A[i], b = B[i]; i < min(A.size(), B.size()); a = A[++i], b = B[i]) #define enumzip6(i, a, b, A, B, s) if(min(A.size(), B.size()) >= 1) for(ll i = s, a = A[i - s], b = B[i - s]; i - s < min(A.size(), B.size()); a = A[++i - s], b = B[i - s]) #define overload6(a, b, c, d, e, f, g, ...) g #define zip(...) overload6(__VA_ARGS__, enumzip6, enumzip5, zip4, _, _, _)(__VA_ARGS__) #define INT(...) int __VA_ARGS__; inp(__VA_ARGS__); #define LL(...) ll __VA_ARGS__; inp(__VA_ARGS__); #define STRING(...) string __VA_ARGS__; inp(__VA_ARGS__); #define CHAR(...) char __VA_ARGS__; inp(__VA_ARGS__); #define VEC(T, A, n) vector A(n); inp(A); #define VVEC(T, A, n, m) vector> A(n, vector(m)); inp(A); const ll MOD1 = 1000000007; const ll MOD9 = 998244353; template auto min(const T& a){ return *min_element(all(a)); } template auto max(const T& a){ return *max_element(all(a)); } template inline bool chmax(T &a, const S &b) { return (a < b ? a = b, 1 : 0); } template inline bool chmin(T &a, const S &b) { return (a > b ? a = b, 1 : 0); } void FLUSH(){cout << flush;} void print(){cout << endl;} template void print(Head &&head, Tail &&... tail) { cout << head; if (sizeof...(Tail)) cout << spa; print(forward(tail)...); } template void print(vector &A){ int n = A.size(); for(int i = 0; i < n; i++){ cout << A[i]; if(i == n - 1) cout << endl; else cout << spa; } } template void print(vector> &A){ for(auto &row: A) print(row); } template void print(pair &A){ cout << A.first << spa << A.second << endl; } template void print(vector> &A){ for(auto &row: A) print(row); } template void prisep(vector &A, S sep){ int n = A.size(); for(int i = 0; i < n; i++){ cout << A[i]; if(i == n - 1) cout << endl; else cout << sep; } } template void priend(T A, S end){ cout << A << end; } template void priend(T A){ priend(A, spa); } template void inp(T&... a){ (cin >> ... >> a); } template void inp(vector &A){ for(auto &a:A) cin >> a; } template void inp(vector> &A){ for(auto &row:A) inp(row); } template void inp(pair &A){ inp(A.first, A.second); } template void inp(vector> &A){ for(auto &row: A) inp(row.first, row.second); } template T sum(vector &A){ T tot = 0; for(auto a:A) tot += a; return tot; } #line 2 "Library/C++/math/pollard_rho.hpp" #line 2 "Library/C++/math/modpow.hpp" template T modpow(T a, long long b, T MOD){ T ret = 1; while(b > 0){ if(b & 1){ ret *= a; ret %= MOD; } a *= a; a %= MOD; b >>= 1; } return ret; } #line 3 "Library/C++/math/millerRabin.hpp" bool isPrime(long long n){ if(n <= 1) return false; else if(n == 2) return true; else if(n % 2 == 0) return false; long long A[7] = {2, 325, 9375, 28178, 450775, 9780504, 1795265022}; long long s = 0; long long d = n - 1; while(d % 2 == 0){ d /= 2; s++; } for(auto a: A){ if(a % n == 0) return true; long long x = modpow<__int128_t>(a, d, n); if(x != 1){ bool ng = true; for(int i = 0; i < s; i++){ if(x == n - 1){ ng = false; break; }; x = __int128_t(x) * x % n; } if(ng) return false; } } return true; } #line 4 "Library/C++/math/pollard_rho.hpp" long long pollard(long long N) { if (N % 2 == 0) return 2; if (isPrime(N)) return N; auto f = [&](long long x) -> long long { return (__int128_t(x) * x + 1) % N; }; long long step = 0; while (true) { ++step; long long x = step, y = f(x); while (true) { long long p = gcd(y - x + N, N); if (p == 0 || p == N) break; if (p != 1) return p; x = f(x); y = f(f(y)); } } } vector primefact(long long N) { if (N == 1) return {}; long long p = pollard(N); if (p == N) return {p}; vector left = primefact(p); vector right = primefact(N / p); left.insert(left.end(), right.begin(), right.end()); sort(left.begin(), left.end()); return left; } #line 3 "Library/C++/math/totient.hpp" template T totient(T n){ vector primes = primefact(n); primes.erase(unique(primes.begin(), primes.end()), primes.end()); for(auto p:primes){ n /= p; n *= p - 1; } return n; } #line 142 "B.cpp" void solve(){ LL(m, d, n, b); if(n == 0){ if(m % d != 10) print(m % b); else print('A'); return; } if(m == 0 && d % b == 0){ print(1); return; } ll MOD = b * totient(b); vec(int, A, 0); vec(bool, used, MOD, false); d %= MOD; if(m == 0){ n--; m = 1; } m %= MOD; while(!used[m]){ used[m] = true; A.push_back(m); m = modpow(m + d, m + MOD, MOD); } if(n < len(A)){ if(A[n] % b != 10) print(A[n] % b); else print('A'); return; } n -= len(A); int loop; enum(i, a, A){ if(a == m){ loop = len(A) - i; break; } } n -= loop; fori(n) m = modpow(m + d, m + MOD, MOD); if(m % b != 10)print(m % b); else print('A'); } int main(){ cin.tie(0)->sync_with_stdio(0); int t; t = 1; // cin >> t; while(t--) solve(); return 0; }