顺序不同算不同方案,因此用线性 DP最自然。我们让:
dp[k]
表示长度为 k
的总合法方案数;endA[k]
表示长度为 k
的方案里,最后一段为 a 的方案数。为什么只需额外维护 endA[k]
?因为限制仅在“上一段是 a 时不能接 c”。也就是说,当我们尝试把最后一段选为 c 时,只要从 k-c
的所有方案里扣除那些“最后一段为 a”的方案即可。
在小红书“品牌创意工坊”中,营销人员可以为直播和短视频活动创建定制化丝带AR特效,结合品牌ID与礼盒包装场景,实现动态丝带动画。为了支撑亿级日活的前端渲染,后端需要在活动发布时预先计算并缓存所有可能的切割方案数,确保小程序组件和Web端秒级响应。
现有一根虚拟丝带长度为k,可以将其分割成若干段或保持一整段不动,但是每段长度只能取整数a、b或c中的一个,且不允许任何长度为a的段后面直接跟随长度为c的段。
请对所有长度k(1≤k≤n) ,统计合法的切割方案数,供小红书前端组件批量加载与渲染。由于答案可能很大,
请将答案对(109+7)取模后输出。顺序不同视为不同方案。
每个测试文件均包含多组测试数据。第一行输入一个整数T(1≤T≤104)代表数据组数,每组测试数据描述如下:
在一行上输入四个整数n,a,b,c(1≤n,a,b,c≤106),代表最大丝带长度、可选分段长度a,b,c。保证a,b,c两两互不相等。
除此之外,保证单个测试文件的n之和不超过 106。
对于每组测试数据,新起一行,输出n个整数,其中第k个数表示长度为k的丝带的合法分割方案数对109+7取模的结果。
输入
2
5 1 2 3
4 1 2 3
输出
1 2 4 6 11
1 2 4 6
说明
在第一个样例中,当n=5,a=1,b=2,c=3时: