【GMOJ6377】幽曲[埋骨于弘川]
Description \(n\in[1,500],k\in[2,10]\) 。 Solution 这是一道 有点 很有难度的题。 先考虑判断一个数是否在数列 \(a\) 中。由于每次加的数是在 \([0,k)\) 的范围内,所以个位不定,但除个以外的位可以任意取值。 考虑DP。记个位为第 \(1\) 位,设 \(g_{i,p,x,a}\) 表示我们构造的数第 \(2\sim i\) 位为0,第 \(i\sim\infty\) 位中最大的位值为 \(p\) ,个位为 \(a\) ,此时我们要将第 \(i\) 位刚好填到 \(x\) ,个位变成了多少。 初值的话,可以暴力算出 \(i\in[1,2]\) 时的 \(g\) 。 不进位的转移显然。进位时,比如我们想算 \(g_{i+1,p,1,a}\) 的值,它可以由 \(g_{i,k-1,1,a'}\) 转移而来( \(a'\) 表示我们在第 \(i\) 位填 \(k\) 次 \(1\) 后 \(a\) 会变成的数)。 然后做树形DP。如果我们沿着子树节点序列转移,那么实际上就是沿着dfs序转移,可以转移到 \(dfn[i]\) 的范围是 \([dfn[fa[i]],dfn[i])\) 。 设 \(dp_{dfn[x],j,p,a}\) 表示我们做到点 \(x\) ,考虑到第 \(j\) 位(第 \(j\) 位放 \(d[x]\) )