[ARC107D] Number of Multisets题解
很显然的动态规划。
令 $f_{i,j}$ 为 $n=i$,$k=j$ 时满足题意的集合数。
依题意可得:一个集合可以只由另一个集合添加元素或将所有元素除二得到。
初始:$f_{0,0}=1$。
目标:$f_{n,k}$。
所以可得:
- $f_{i,j}=f_{i-1,j-1}+f_{i,j}$。
- $f_{i,j}=f_{i,j×2}+f_{i,j}$。
代码:
int main() { int n,k; cin>>n>>k; f[0][0]=1; for(int i=1;i<=n;i++) { for(int j=i;j>=1;j--) { f[i][j]=f[i-1][j-1]; if(j*2<=i) { f[i][j]+=f[i][j*2]; } f[i][j]%=998244353; } } cout<<f[n][k]; return 0; }