#include // #include // using namespace atcoder; typedef long long ll; typedef long double ld; #define rep(i,n) for(ll i=0;i<(n);i++) #define repr(i,n) for(ll i=(n-1);i>=0;i--) #define all(x) x.begin(),x.end() #define br cout << '\n'; using namespace std; const long long INF = 8e18; using Graph = vector>; template inline bool chmin(T &a, T b) { if(a > b){ a = b; return true;} return false;} template inline bool chmax(T &a, T b) { if(a < b){ a = b; return true;} return false;} ll ceilll(ll a, ll b) {return (a + b-1) / b;} // if(a%b != 0) (a/b) + 1 ll get_digit(ll a) {ll digit = 0; while(a != 0){a /= 10; digit++;} return digit;} // a != 0 template void vecdbg(vector& v){ rep(i, v.size()){cerr << v[i] << ' ';} cerr << '\n';} template void vecvecdbg(vector>& v){ rep(i, v.size()){rep(j, v[i].size()){cerr << v[i][j] << ' ';} cerr << '\n';}} ll POW(ll a, ll n){ ll res = 1; while(n > 0){ if(n & 1){ res = res * a; } a *= a; n >>= 1; } return res; } using P = pair; const double PI = acos(-1); // 0 false, 1 true // string number to int : -48 or - '0' // a to A : -32 // ceil(a) 1.2->2.0 // c++17 g++ -std=c++17 a.cpp // global vector -> 0 initialization // DONT FORGET TO INTIALIZE // The type of GRID is CHAR. DONT USE STRING // If the result in local and judge is different, USE CODETEST!! // (a * b)over flow? if(a > INF / b){ /* overflow */} //https://atcoder.jp/contests/abc172/submissions/14765570 //20200724 template struct ModInt { long long x; ModInt () : x(0) {} ModInt (long long x) : x(x >= 0 ? x % mod : (mod - -x % mod) % mod) {} ModInt &operator += (const ModInt &p){ if ((x += p.x) >= mod) x -= mod; return *this; } ModInt &operator -= (const ModInt &p) { if ((x += mod - p.x) >= mod) x -= mod; return *this; } ModInt &operator *= (const ModInt &p) { x = (long long) x * p.x % mod; return *this; } ModInt &operator /= (const ModInt &p) { *this *= p.inverse(); return *this; } ModInt &operator ^= (long long p) { ModInt res = 1; for (; p; p >>= 1) { if (p & 1) res *= *this; *this *= *this; } return *this = res; } ModInt operator - () const { return ModInt(-x); } ModInt operator + (const ModInt &p) const { return ModInt(*this) += p; } ModInt operator - (const ModInt &p) const { return ModInt(*this) -= p; } ModInt operator * (const ModInt &p) const { return ModInt(*this) *= p; } ModInt operator / (const ModInt &p) const { return ModInt(*this) /= p; } ModInt operator ^ (long long p) const { return ModInt(*this) ^= p; } bool operator == (const ModInt &p) const { return x == p.x; } bool operator != (const ModInt &p) const { return x != p.x; } explicit operator long long() const { return x; } ModInt &operator = (const long long p) { x = p; return *this;} ModInt inverse() const { long long a = x, b = mod, u = 1, v = 0, t; while (b > 0) { t = a / b; a -= t * b; std::swap(a, b); u -= t * v; std::swap(u, v); } return ModInt(u); } friend std::ostream & operator << (std::ostream &stream, const ModInt &p) { return stream << p.x; } friend std::istream & operator >> (std::istream &stream, ModInt &a) { long long x; stream >> x; a = ModInt(x); return stream; } }; template struct MComb { using mint = ModInt; std::vector fact; std::vector inv; MComb (long long n) { // O(n + log(mod)) fact = std::vector(n + 1, 1); for (long long i = 1; i <= n; i++) fact[i] = fact[i - 1] * mint(i); inv.resize(n + 1); inv[n] = fact[n] ^ (mod - 2); for (long long i = n; i--; ) inv[i] = inv[i + 1] * mint(i + 1); } mint ncr(long long n, long r) { return fact[n] * inv[r] * inv[n - r]; } mint npr(long n, long r) { return fact[n] * inv[n - r]; } //nhr : n : shikiri + 1, r : tamanokazu mint nhr(long n, long r) { assert(n + r - 1 < (long long) fact.size()); return ncr(n + r - 1, r); } }; template struct MPow { using mint = ModInt; mint modpow(mint a, long long n) { mint res = 1; while(n > 0){ if(n & 1){ res = res * a; } a = a * a; n >>= 1; } return res; } }; #define MOD 998244353 typedef ModInt mint; MComb com(510000); // com.ncr(n, r) n < r の値入れちゃダメ nprも nhrは入れていい MPow mpow; int main() { std::cout << std::fixed << std::setprecision(15); ll a, n; cin >> a >> n; ll m = 998244353; cout << m << endl; cout << mpow.modpow(a, n) << endl; }