[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;
}

 

posted @ 2024-12-14 22:05  _Acheron  阅读(0)  评论(0编辑  收藏  举报