#include using namespace std; using ll = long long; const ll MOD = 1e9 + 7; // 繰り返し二乗法 (a^b % mod) ll modpow(ll a, ll b, ll mod) { ll res = 1; a %= mod; while (b > 0) { if (b & 1) res = res * a % mod; a = a * a % mod; b >>= 1; } return res; } int main() { // 戦略的に A と B を選ぶ(固定でも OK) ll A = 101 * 103 * 107; // 小さい素数の積 ll B = 100003; // 大きめの素数 // Y = A^B mod MOD を求める ll Y = modpow(A, B, MOD); // A と B を出力(ジャッジに送信) cout << A << " " << B << endl; cout.flush(); // ジャッジから GCD(X, Y) = K を受け取る ll K; cin >> K; // X の候補を全探索(X ∈ [100, 100000]) vector candidates; for (ll x = 100; x <= 100000; ++x) { if (__gcd(x, Y) == K) { candidates.push_back(x); } } // X′ = X^A mod B を計算して候補から1つ選ぶ(今回は最初の候補) if (candidates.empty()) { cerr << "No valid X found." << endl; return 1; } ll x = candidates[0]; ll X_prime = modpow(x, A, B); // 推測した X′ を出力 cout << X_prime << endl; cout.flush(); return 0; }