ARC107D题解

厉害题。

考虑从大到小塞入背包,相当于塞入物品后令体积为 \(2\) 倍,然后背包容量也变为 \(2\) 倍。

然后问题变为原问题,可以一直塞 \(1\)

\(dp[n][k]=dp[n-1][k-1]+dp[n][2\times k]\),边界条件 \(dp[n][k]=0(n\leq k)\)

对应到 GF上就是:

\[[x^ky^n]\prod_{i=0}(\sum_{j=0}x^{2^{-i}j}y^i) \]

\(F(x,y)=\prod_{i=0}(\sum_{j=0}x^{2^{-i}j}y^i)\),则有:

\[F(x,y)=(\sum_{i=0}x^iy^i)F(\sqrt{x},y) \]

\[F(x,y)=\frac{1}{1-xy}F(\sqrt{x},y) \]

\[[x^ky^n]F(x,y)=\sum_{i=0}[x^{2(k-i)}y^{n-i}]F(x,y) \]

但是观察到一个性质:\(1+x\times\frac{1}{1-x}=\frac{1}{1-x}\)

所以上面能写成:

\[F(x,y)=(1+xy\times\frac{1}{1-xy})F(\sqrt{x},y) \]

\[F(x,y)=F(\sqrt{x},y)+xy\times F(x,y) \]

\[[x^ky^n]F(x,y)=[x^{2k}y^n]F(x,y)+[x^{k-1}y^{n-1}]F(x,y) \]

但是注意到一件事情,如果 \(n<m\) 那么一定有 \([x^ny^m]F(x,y)=0\),这个作为边界条件就好了。

复杂度 \(O(nk)\)

#include<cstdio>
const int M=3005,mod=998244353;
int n,k,dp[M][M];
inline int Solve(const int&n,const int&k){
	return n<=k?n==k:!k?0:!~dp[n][k]?dp[n][k]=(Solve(n-1,k-1)+Solve(n,k<<1))%mod:dp[n][k];
}
signed main(){
	scanf("%d%d",&n,&k);for(int i=0;i<=n;++i)for(int j=0;j<=n;++j)dp[i][j]=-1;printf("%d",Solve(n,k));
}
posted @ 2022-08-25 17:02  Prean  阅读(29)  评论(0编辑  收藏  举报
var canShowAdsense=function(){return !!0};