#include <bits/stdc++.h>
//#include <ext/pb_ds/assoc_container.hpp>
//using namespace __gnu_pbds;
using namespace std;
//typedef tree<int,null_type,less_equal<int>,rb_tree_tag, tree_order_statistics_node_update> ordered_set;
#define int long long
#define mem(a,x) memset(a,x,sizeof(a))
#define fast(s) s.reserve(2000); s.max_load_factor(0.5);
#define F first
#define S second
#define pii pair <int, int>
#define all(p) p.begin(), p.end()
template<typename T> bool maximum(T &A, const T &B) {return A<B? A=B, true: false;}
template<typename T> bool minimum(T &A, const T &B) {return A>B? A=B, true: false;}
const int mod=998244353;
const int base=2999;
const int INF=1e9;
const int N=1e5+5, M=10;
int n, k, dp[100][101];
void file()
{
#define task "diduduadi"
if(fopen(task".inp","r"))
{
freopen(task".inp","r",stdin);
freopen(task".out","w",stdout);
}
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
}
struct Matrix
{
int n, m;
vector<vector<int>> d;
Matrix(int n=0, int m=0): n(n), m(m) {d.resize(n,vector<int>(m,0));}
Matrix(const vector<vector<int>> &d): d(d)
{
n=(int)d.size();
m=(n? (int)d[0].size(): 0);
}
Matrix operator* (const Matrix &a) const
{
int x=n, y=m, z=a.m;
Matrix res(x,z);
for(int i=0; i<x; ++i) for(int j=0; j<y; ++j) for(int k=0; k<z; ++k)
{
res.d[i][j]+=d[i][k]*a.d[k][j];
res.d[i][j]%=mod;
}
return res;
}
Matrix operator^ (int k) const
{
Matrix res(n,n);
for(int i=0; i<n; ++i) res.d[i][i]=1;
Matrix tmp=*this;
while(k)
{
if(k&1) res=res*tmp;
tmp=tmp*tmp;
k>>=1;
}
return res;
}
};
vector<vector<int>> tmp;
int pos(int i, int j)
{
return i*11+j;
}
void Solve()
{
cin>>n>>k;
n-=k*(k-1)/2;
if(n<k) return void(cout<<"0\n");
dp[0][0]=1;
for(int i=1; i<10; ++i)
{
for(int j=1; j<=10; ++j)
{
dp[i][j]+=dp[i-1][j-1];
if(i>=j) (dp[i][j]+=dp[i-j][j]);
}
}
if(n<10) return void(cout<<dp[n][k]<<"\n");
tmp.resize(1,vector<int>(110));
for(int i=0; i<10; ++i)
for(int j=0; j<=10; ++j)
tmp[0][pos(i,j)]=dp[i][j];
Matrix mt(tmp);
tmp.clear();
tmp.resize(110,vector<int>(110,0));
for(int i=0; i<10; ++i)
{
for(int j=1; j<=10; ++j)
{
if(i<9)
{
tmp[pos(i+1,j)][pos(i,j)]=1;
continue;
}
tmp[pos(i,j-1)][pos(i,j)]=1;
if(i-j+1>=0) tmp[pos(i-j+1,j)][pos(i,j)]=1;
}
}
Matrix kk(tmp);
kk=kk^(n-9);
mt=mt*kk;
cout<<mt.d[0][pos(9,k)]<<"\n";
}
main()
{
file();
Solve();
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+Ci8vI2luY2x1ZGUgPGV4dC9wYl9kcy9hc3NvY19jb250YWluZXIuaHBwPgoKLy91c2luZyBuYW1lc3BhY2UgX19nbnVfcGJkczsKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLy90eXBlZGVmIHRyZWU8aW50LG51bGxfdHlwZSxsZXNzX2VxdWFsPGludD4scmJfdHJlZV90YWcsIHRyZWVfb3JkZXJfc3RhdGlzdGljc19ub2RlX3VwZGF0ZT4gb3JkZXJlZF9zZXQ7CiNkZWZpbmUgaW50ICAgICAgICAgICAgbG9uZyBsb25nCiNkZWZpbmUgbWVtKGEseCkgICAgICAgbWVtc2V0KGEseCxzaXplb2YoYSkpCiNkZWZpbmUgZmFzdChzKSAgICAgICAgcy5yZXNlcnZlKDIwMDApOyBzLm1heF9sb2FkX2ZhY3RvcigwLjUpOwojZGVmaW5lIEYgICAgICAgICAgICAgIGZpcnN0CiNkZWZpbmUgUyAgICAgICAgICAgICAgc2Vjb25kCiNkZWZpbmUgcGlpICAgICAgICAgICAgcGFpciA8aW50LCBpbnQ+CiNkZWZpbmUgYWxsKHApICAgICAgICAgcC5iZWdpbigpLCBwLmVuZCgpCnRlbXBsYXRlPHR5cGVuYW1lIFQ+IGJvb2wgbWF4aW11bShUICZBLCBjb25zdCBUICZCKSB7cmV0dXJuIEE8Qj8gQT1CLCB0cnVlOiBmYWxzZTt9CnRlbXBsYXRlPHR5cGVuYW1lIFQ+IGJvb2wgbWluaW11bShUICZBLCBjb25zdCBUICZCKSB7cmV0dXJuIEE+Qj8gQT1CLCB0cnVlOiBmYWxzZTt9CmNvbnN0IGludCBtb2Q9OTk4MjQ0MzUzOwpjb25zdCBpbnQgYmFzZT0yOTk5Owpjb25zdCBpbnQgSU5GPTFlOTsKY29uc3QgaW50IE49MWU1KzUsIE09MTA7CmludCBuLCBrLCBkcFsxMDBdWzEwMV07CnZvaWQgZmlsZSgpCnsKICAgICNkZWZpbmUgdGFzayAiZGlkdWR1YWRpIgogICAgaWYoZm9wZW4odGFzayIuaW5wIiwiciIpKQogICAgewogICAgICAgIGZyZW9wZW4odGFzayIuaW5wIiwiciIsc3RkaW4pOwogICAgICAgIGZyZW9wZW4odGFzayIub3V0IiwidyIsc3Rkb3V0KTsKICAgIH0KICAgIGlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOwogICAgY2luLnRpZSgwKTsKICAgIGNvdXQudGllKDApOwp9CnN0cnVjdCBNYXRyaXgKewogICAgaW50IG4sIG07CiAgICB2ZWN0b3I8dmVjdG9yPGludD4+IGQ7CiAgICBNYXRyaXgoaW50IG49MCwgaW50IG09MCk6IG4obiksIG0obSkge2QucmVzaXplKG4sdmVjdG9yPGludD4obSwwKSk7fQogICAgTWF0cml4KGNvbnN0IHZlY3Rvcjx2ZWN0b3I8aW50Pj4gJmQpOiBkKGQpCiAgICB7CiAgICAgICAgbj0oaW50KWQuc2l6ZSgpOwogICAgICAgIG09KG4/IChpbnQpZFswXS5zaXplKCk6IDApOwogICAgfQogICAgTWF0cml4IG9wZXJhdG9yKiAoY29uc3QgTWF0cml4ICZhKSBjb25zdAogICAgewogICAgICAgIGludCB4PW4sIHk9bSwgej1hLm07CiAgICAgICAgTWF0cml4IHJlcyh4LHopOwogICAgICAgIGZvcihpbnQgaT0wOyBpPHg7ICsraSkgZm9yKGludCBqPTA7IGo8eTsgKytqKSBmb3IoaW50IGs9MDsgazx6OyArK2spCiAgICAgICAgewogICAgICAgICAgICByZXMuZFtpXVtqXSs9ZFtpXVtrXSphLmRba11bal07CiAgICAgICAgICAgIHJlcy5kW2ldW2pdJT1tb2Q7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXM7CiAgICB9CiAgICBNYXRyaXggb3BlcmF0b3JeIChpbnQgaykgY29uc3QKICAgIHsKICAgICAgICBNYXRyaXggcmVzKG4sbik7CiAgICAgICAgZm9yKGludCBpPTA7IGk8bjsgKytpKSByZXMuZFtpXVtpXT0xOwogICAgICAgIE1hdHJpeCB0bXA9KnRoaXM7CiAgICAgICAgd2hpbGUoaykKICAgICAgICB7CiAgICAgICAgICAgIGlmKGsmMSkgcmVzPXJlcyp0bXA7CiAgICAgICAgICAgIHRtcD10bXAqdG1wOwogICAgICAgICAgICBrPj49MTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlczsKICAgIH0KfTsKdmVjdG9yPHZlY3RvcjxpbnQ+PiB0bXA7CmludCBwb3MoaW50IGksIGludCBqKQp7CiAgICByZXR1cm4gaSoxMStqOwp9CnZvaWQgU29sdmUoKQp7CiAgICBjaW4+Pm4+Pms7CiAgICBuLT1rKihrLTEpLzI7CiAgICBpZihuPGspIHJldHVybiB2b2lkKGNvdXQ8PCIwXG4iKTsKICAgIGRwWzBdWzBdPTE7CiAgICBmb3IoaW50IGk9MTsgaTwxMDsgKytpKQogICAgewogICAgICAgIGZvcihpbnQgaj0xOyBqPD0xMDsgKytqKQogICAgICAgIHsKICAgICAgICAgICAgZHBbaV1bal0rPWRwW2ktMV1bai0xXTsKICAgICAgICAgICAgaWYoaT49aikgKGRwW2ldW2pdKz1kcFtpLWpdW2pdKTsKICAgICAgICB9CiAgICB9CiAgICBpZihuPDEwKSByZXR1cm4gdm9pZChjb3V0PDxkcFtuXVtrXTw8IlxuIik7CiAgICB0bXAucmVzaXplKDEsdmVjdG9yPGludD4oMTEwKSk7CiAgICBmb3IoaW50IGk9MDsgaTwxMDsgKytpKQogICAgICAgIGZvcihpbnQgaj0wOyBqPD0xMDsgKytqKQogICAgICAgICAgICB0bXBbMF1bcG9zKGksaildPWRwW2ldW2pdOwogICAgTWF0cml4IG10KHRtcCk7CiAgICB0bXAuY2xlYXIoKTsKICAgIHRtcC5yZXNpemUoMTEwLHZlY3RvcjxpbnQ+KDExMCwwKSk7CiAgICBmb3IoaW50IGk9MDsgaTwxMDsgKytpKQogICAgewogICAgICAgIGZvcihpbnQgaj0xOyBqPD0xMDsgKytqKQogICAgICAgIHsKICAgICAgICAgICAgaWYoaTw5KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0bXBbcG9zKGkrMSxqKV1bcG9zKGksaildPTE7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0bXBbcG9zKGksai0xKV1bcG9zKGksaildPTE7CiAgICAgICAgICAgIGlmKGktaisxPj0wKSB0bXBbcG9zKGktaisxLGopXVtwb3MoaSxqKV09MTsKICAgICAgICB9CiAgICB9CiAgICBNYXRyaXgga2sodG1wKTsKICAgIGtrPWtrXihuLTkpOwogICAgbXQ9bXQqa2s7CiAgICBjb3V0PDxtdC5kWzBdW3Bvcyg5LGspXTw8IlxuIjsKfQoKbWFpbigpCnsKICAgIGZpbGUoKTsKICAgIFNvbHZlKCk7CiAgICByZXR1cm4gMDsKfQoK