给定允许的分段长度集合 {a,b,c}
,需要统计长度为 k(1≤k≤n)
的所有切割序列数,且不允许出现相邻片段为“a
后紧跟 c
”的情形。顺序不同视为不同方案,答案对 MOD=1e9+7
取模。
为了表达“不能出现 a→c 的相邻关系”,只需记住序列最后一段的类型。设:
dpA[k]
:和为 k
、且最后一段长度为 a
的方案数dpB[k]
:和为 k
、且最后一段长度为 b
的方案数在小红书“品牌创意工坊”中,营销人员可以为直播和短视频活动创建定制化丝带AR特效,结合品牌 ID 与礼盒包装场景,实现动态丝带动画。为了支撑亿级日活的前端渲染,后端需要在活动发布时预先计算并缓存所有可能的切割方案数,确保小程序组件和 Web 端秒级响应。
现有一根虚拟丝带长度为 k ,可以将其分割成若干段或保持一整段不动,但是每段长度只能取整数 a、b 或 c 中的一个,且不允许任何长度为 a 的段后面直接跟随长度为 c 的段。
请对所有长度 k(1≤k≤n) ,统计合法的切割方案数,供小红书前端组件批量加载与渲染。由于答案可能很大,请将答案对 (109+7) 取模后输出。顺序不同视为不同方案。
每个测试文件均包含多组测试数据。第一行输入一个整数 T(1≤T≤10) 代表数据组数,每组测试数据描述如下:
在一行上输入四个整数 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 时:
k=1 时,仅有一种分割方案 {1} ;
k=2 时,有 {1,1} 和 {2} 两种方案;
k=3 时,有 {1,1,1},{1,2},{2,1},{3} 共 4 种方案;
k=4 时,按不带约束的方式共有 7 种方案,但其中 {1,3} 不合法,故为 6 种;