#include #include using namespace std; typedef long long LL; const int N = 130; const LL MOD = 998244353; LL n, ans; int k, sz; struct Matrix { int v[N][N]; Matrix operator *(Matrix o) { Matrix r = {}; for (int i = 1; i <= sz; ++i) { for (int j = 1; j <= sz; ++j) { for (int k = 1; k <= sz; ++k) { r.v[i][k] = (r.v[i][k] + 1LL * v[i][j] * o.v[j][k]) % MOD; } } } return r; } Matrix operator *=(Matrix o) { return *this = *this * o; } }; Matrix mt; Matrix QMI(Matrix x, LL m) { Matrix ret = {}; for (int i = 1; i <= sz; ++i) ret.v[i][i] = 1; while (m) { if (m & 1) ret *= x; x *= x; m >>= 1; } return ret; } int main() { scanf("%lld%d", &n, &k); sz = k * k * k; for (int a = 0; a < k; ++a) { for (int b = 0; b < k; ++b) { for (int c = 0; c < k; ++c) { int from = a * k * k + b * k + c + 1; ++mt.v[((a + 1) % k) * k * k + b * k + c + 1][from]; ++mt.v[a * k * k + ((b + a) % k) * k + c + 1][from]; ++mt.v[a * k * k + b * k + (c + b) % k + 1][from]; } } } mt = QMI(mt, n); ans = 0LL; for (int a = 0; a < k; ++a) { for (int b = 0; b < k; ++b) { ans = (ans + mt.v[a * k * k + b * k + 1][1]) % MOD; } } printf("%lld\n", ans); return 0; }