#include "bits/stdc++.h"
using namespace std;
const int D=1e4;
const long long N=1e12;
const int MOD=998244353;
long long n, d;
int C[D+1][D+2];
int add(int a, int b){
return (a+b>=MOD?a+b-MOD:a+b);
}
int add2(int &a, int b){
return a=add(a,b);
}
int main() {
cin >> n >> d;
d--;
for(int i=0; i<=d; i++) C[i][0]=1;
for(int i=1; i<=d; i++){
for(int j=1; j<=i; j++){
C[i][j]=add(C[i-1][j], C[i-1][j-1]);
// cout << "C[" <<i << "][" << j << "] " << C[i][j] << "\n";
}
}
int ans = 2;
for(int k=1; k<=d+1; k++){
vector<vector<int>> c={{C[d][k], k-1<0?0:C[d][k-1]}, {k-1<0?0:C[d][k-1], k-2<0?0:C[d][k-2]}};
vector<vector<int>> m={{1, 0}, {0, 1}};
auto mult=[&](vector<vector<int>> a, vector<vector<int>> b)->vector<vector<int>>{
vector<vector<int>> c(2,vector<int>(2));
for(int i=0; i<2; i++){
for(int j=0; j<2; j++){
for(int k=0; k<2; k++){
add2(c[i][j], ((long long)a[i][k]*b[k][j])%MOD);
}
}
}
return c;
};
for(int i=0; (1LL<<i)<=n; i++){
if(n&(1LL<<i)){
m=mult(c, m);
}
c=mult(c,c);
}
// cout << m[0][0] << " " << m[0][1] << '\n' << m[1][0] << " " << m[1][1] << '\n';
add2(ans, add(m[0][0], m[1][1]));
}
cout << ans;
}
I2luY2x1ZGUgImJpdHMvc3RkYysrLmgiCnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgpjb25zdCBpbnQgRD0xZTQ7CmNvbnN0IGxvbmcgbG9uZyBOPTFlMTI7CmNvbnN0IGludCBNT0Q9OTk4MjQ0MzUzOwoKbG9uZyBsb25nIG4sIGQ7CmludCBDW0QrMV1bRCsyXTsKCmludCBhZGQoaW50IGEsIGludCBiKXsKCXJldHVybiAoYStiPj1NT0Q/YStiLU1PRDphK2IpOwp9CgppbnQgYWRkMihpbnQgJmEsIGludCBiKXsKCXJldHVybiBhPWFkZChhLGIpOwp9CgppbnQgbWFpbigpIHsKCWNpbiA+PiBuID4+IGQ7CglkLS07CgkKCWZvcihpbnQgaT0wOyBpPD1kOyBpKyspIENbaV1bMF09MTsKCWZvcihpbnQgaT0xOyBpPD1kOyBpKyspewoJCWZvcihpbnQgaj0xOyBqPD1pOyBqKyspewoJCQlDW2ldW2pdPWFkZChDW2ktMV1bal0sIENbaS0xXVtqLTFdKTsKCQkJLy8gY291dCA8PCAiQ1siIDw8aSA8PCAiXVsiIDw8IGogPDwgIl0gIiA8PCBDW2ldW2pdIDw8ICJcbiI7CgkJfQoJfQoJCglpbnQgYW5zID0gMjsKCWZvcihpbnQgaz0xOyBrPD1kKzE7IGsrKyl7CgkJdmVjdG9yPHZlY3RvcjxpbnQ+PiBjPXt7Q1tkXVtrXSwgay0xPDA/MDpDW2RdW2stMV19LCB7ay0xPDA/MDpDW2RdW2stMV0sIGstMjwwPzA6Q1tkXVtrLTJdfX07CgkJdmVjdG9yPHZlY3RvcjxpbnQ+PiBtPXt7MSwgMH0sIHswLCAxfX07CgkJCgkJYXV0byBtdWx0PVsmXSh2ZWN0b3I8dmVjdG9yPGludD4+IGEsIHZlY3Rvcjx2ZWN0b3I8aW50Pj4gYiktPnZlY3Rvcjx2ZWN0b3I8aW50Pj57CgkJCXZlY3Rvcjx2ZWN0b3I8aW50Pj4gYygyLHZlY3RvcjxpbnQ+KDIpKTsKCQkJZm9yKGludCBpPTA7IGk8MjsgaSsrKXsKCQkJCWZvcihpbnQgaj0wOyBqPDI7IGorKyl7CgkJCQkJZm9yKGludCBrPTA7IGs8MjsgaysrKXsKCQkJCQkJYWRkMihjW2ldW2pdLCAoKGxvbmcgbG9uZylhW2ldW2tdKmJba11bal0pJU1PRCk7CgkJCQkJfQoJCQkJfQoJCQl9CQoJCQlyZXR1cm4gYzsKCQl9OwoJCQoJCWZvcihpbnQgaT0wOyAoMUxMPDxpKTw9bjsgaSsrKXsKCQkJaWYobiYoMUxMPDxpKSl7CgkJCQltPW11bHQoYywgbSk7CgkJCX0KCQkJYz1tdWx0KGMsYyk7CgkJfQoJCS8vIGNvdXQgPDwgbVswXVswXSA8PCAiICIgPDwgbVswXVsxXSA8PCAnXG4nIDw8IG1bMV1bMF0gPDwgIiAiIDw8IG1bMV1bMV0gPDwgJ1xuJzsKCQlhZGQyKGFucywgYWRkKG1bMF1bMF0sIG1bMV1bMV0pKTsKCX0KCWNvdXQgPDwgYW5zOwp9