ARC107D
好题!
考虑到一个集合的元素是无序的,我们不妨将其按从小到大排序,例如这么一个集合:
也就是说,任意一个题目所求的集合均可以表示成先加入
通过上面那个思路,我们每一次拓展集合,我们不妨先加入一个
设
而乘
然后就做完了,复杂度
#include<bits/stdc++.h>
//#define int long long
#define ll long long
#define ull unsigned long long
#define ld long double
#define PII pair<int,int>
#define INF 0x3f3f3f3f
#define INFLL 0x3f3f3f3f3f3f3f3f
#define chkmax(a,b) a=max(a,b)
#define chkmin(a,b) a=min(a,b)
#define rep(k,l,r) for(int k=l;k<=r;++k)
#define per(k,r,l) for(int k=r;k>=l;--k)
#define cl(f,x) memset(f,x,sizeof(f))
using namespace std;
const int N=3e3+5,MOD=998244353;
int f[N][N];
signed main() {
int n,k;
scanf("%d%d",&n,&k);
f[0][0]=1;
rep(i,1,n) {
per(j,i,0) {
f[i][j]=f[i-1][j-1];
if(j*2<=i)
f[i][j]=(f[i][j]+f[i][j*2])%MOD;
}
}
printf("%d\n",f[n][k]);
return 0;
}