#include #include #include #include #include using namespace std; typedef long long ll; //このnamespace内のMODという値を、問題の要求に応じて変更すること namespace Mint { //このMODという値を、問題の要求に応じて変更すること const ll MOD = 998244353; template struct Modint { ll val = 0; //コンストラクタ long long, 空, Modintを受け取れる Modint() = default; Modint(const Modint&) = default; Modint(ll _x) { val = _x >= 0 ? _x % Mod : ((_x % Mod) + Mod) % Mod; } //繰り返し二乗法、逆元 基本的に外部からいじるのやめたほうがよさそう。 ll modpow(ll a, ll b) const { ll ret = 1, kakeru = a; while (b > 0) { if (b & 1)ret *= kakeru, ret %= Mod; kakeru *= kakeru, kakeru %= Mod; b >>= 1; } return ret; } Modint inv() const { return modpow((*this).val, MOD - 2); } //代入演算子 Modintとlong longの2通りある Modint operator= (const Modint& p) { val = p.val; return (*this); } //二項演算+代入演算子 二項演算子、同値演算子はクラス外で定義する Modint& operator+= (const Modint& p) { val += p.val; if (val >= Mod)val -= Mod; return (*this); } Modint& operator-= (const Modint& p) { val -= p.val; if (val < 0)val += Mod; return (*this); } Modint& operator*= (const Modint& p) { val *= p.val; val %= Mod; return (*this); } Modint& operator/= (const Modint& p) { //なんか,p.inv()を使うとthisのポインターが変換できませんって出る //Modint tmp(p.inv()); Modint tmp(modpow(p.val, MOD - 2)); (*this) *= tmp; return (*this); } }; //加算 const Modint operator+ (const Modint& l, const Modint& r) { Modint tmp = l; tmp += r; return tmp; } const Modint operator+ (const Modint& l, const ll r) { Modint tmp = l; tmp += Modint(r); return tmp; } const Modint operator+ (const ll l, const Modint& r) { Modint tmp = l; tmp += r; return tmp; } //減算 const Modint operator- (const Modint& l, const Modint& r) { Modint tmp = l; tmp -= r; return tmp; } const Modint operator- (const Modint& l, const ll r) { Modint tmp = l; tmp -= Modint(r); return tmp; } const Modint operator- (const ll l, const Modint& r) { Modint tmp = l; tmp -= r; return tmp; } //乗算 const Modint operator* (const Modint& l, const Modint& r) { Modint tmp = l; tmp *= r; return tmp; } const Modint operator* (const Modint& l, const ll r) { Modint tmp = l; tmp *= Modint(r); return tmp; } const Modint operator* (const ll l, const Modint& r) { Modint tmp = l; tmp *= r; return tmp; } //除算 const Modint operator/ (const Modint& l, const Modint& r) { Modint tmp = l; tmp /= r; return tmp; } const Modint operator/ (const Modint& l, const ll r) { Modint tmp = l; tmp /= Modint(r); return tmp; } const Modint operator/ (const ll l, const Modint& r) { Modint tmp = l; tmp /= r; return tmp; } //同値演算子 const bool operator== (const Modint& l, const Modint& r) { return l.val == r.val; } const bool operator== (const Modint& l, const ll r) { return l.val == r; } const bool operator== (const ll l, const Modint& r) { return l == r.val; } const bool operator!= (const Modint& l, const Modint& r) { return !(l.val == r.val); } const bool operator!= (const Modint& l, const ll r) { return !(l.val == r); } const bool operator!= (const ll l, const Modint& r) { return !(l == r.val); } //istream ostream での入出力サポート std::ostream& operator<<(std::ostream& stream, const Modint& p) { stream << p.val; return stream; } std::istream& operator>>(std::istream& stream, Modint& p) { stream >> p.val; return stream; } //使う用の繰り返し二乗法 bはlong long に注意 Modint modpow(const Modint a, ll b) { ll ret = 1, kakeru = a.val; while (b > 0) { if (b & 1)ret *= kakeru, ret %= MOD; kakeru *= kakeru, kakeru %= MOD; b >>= 1; } Modint tmpret(ret); return tmpret; } } using namespace Mint; using mint = Mint::Modint; ll n, k; int main() { cin >> n >> k; if (n == k) { cout << 1 << endl; return 0; } ll s = n / k; if (n % k != 0)s++; cout << modpow(2, s) - 1 << endl; return 0; }