← Home
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=998244353;
const int N=2026;
int dp[2050];
int dp2[2050][2050];
int ans1[2050],ans2[2050];
ll ans;
int n,k;
void add(int &u,int v){u+=v;u-=(u>=mod)*mod;}
int calc(vector<int>p){
	vector<int>q;
	for(int t=1;t<=k-2;t++){
		int sum=0;
		for(auto x:p) sum+=x;
		if(sum>n) return -1;
		q.clear();
		for(int i=(int)p.size()-1;i>=0;i--){
			while(p[i]--) q.emplace_back(i+1);
		}
		p=q;
	}
	ll sum=0;
	for(int i=(int)p.size()-1;i>=0;i--) sum+=p[i]*(i+1);
	if(sum>n) return -1;
	return sum;
}
vector<int>g;
int num=0;
void dfs(int u,int la){
	// num++;
	// if(num%1000==0) cerr<<num<<"\n";
	g.emplace_back(0);
	for(int i=1;i<=la;i++){
		g[u]=i;
		if(i!=1||u!=0){
			int tmp=calc(g);
			if(tmp==-1) break;
			ans++;
		}
		dfs(u+1,i);
	}
	g.pop_back();
}
int main(){
	// freopen("test.in","r",stdin);
	// freopen("test.out","w",stdout);
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	cin>>n>>k;
	if(k==1){
		dp[0]=1;
		for(int i=1;i<=N;i++){
			for(int j=N;j>=0;j--){
				for(int k=i;k<=j;k+=i) add(dp[j],dp[j-k]);
			}
		}
		ans1[0]=1;
		for(int i=1;i<=N;i++) ans1[i]=(ans1[i-1]+dp[i])%mod;
	}
	if(k==2){
		dp2[0][N]=1;
		for(int i=1;i<=N;i++){
			int d=N/i,_d=(i==1?N:N/(i-1));
			for(int j=N;j>=0;j--){
				for(int k=_d-1;k>=0;k--) add(dp2[j][k],dp2[j][k+1]);
			}
			for(int j=N;j>=0;j--){
				for(int k=0;k<=_d;k++) dp2[j][k]=0;
				for(int k=i,p=1;k<=j&&p<=d;k+=i,p++) dp2[j][p]=dp2[j-k][p],add(ans2[j],dp2[j][p]);
			}
		}
		ans2[0]=1;
		for(int i=1;i<=N;i++) add(ans2[i],ans2[i-1]);
	}
	if(k>=3) dfs(0,100);
	if(k==1){cout<<(ans1[n]-1+mod)%mod<<"\n";return 0;}
	if(k==2){cout<<(ans2[n]-1+mod)%mod<<"\n";return 0;}
	if(k<=12) cout<<(ans+1)%mod<<"\n";
	else cout<<"1\n";
	cerr<<clock()*1.0/CLOCKS_PER_SEC<<"\n";
	return 0;
}