Berlekamp-Massey 算法 - OI Wiki 中 G 的构造方案是:
G={0,0,⋯,0,ΔkΔi,−ΔkΔiFk−1}
(OI Wiki 里实际写的是 Fk,但仔细思考一下就会发现它想表达的其实是 Fk−1)
但这样其实是有问题的——问题在于 Fk−1 末尾的 0 可能并不需要补在后面。
注意是【可能】,也就是说有时候必须得补(以使得有足够多个初值),有时候不需要补(对应的那一个值不作为初值也满足递推关系)——如果一刀切地把 Fk−1 末尾的 0 忽略,也是错的。
不过本题数据似乎并没有考虑到这一点——不论你处不处理,以及如何处理,都能 AC。
一种正确的做法是,在算法结束时暴力判断末尾的 0 是否可以删除,若是则删,直至删不动为止。
还有另一种正确的做法:即像 @皎月半洒花 的题解代码一样,将递推系数 F 的历史版本存储下来,然后选择最优的一个进行转移(仅用以计算长度)。
这里有一些能卡掉上述错误的数据,放在 U228146 【模板】Berlekamp–Massey 算法(数据加强版)中,供大家测试。(可以通过该题目的【附件下载】一栏下载数据)
经测试,题解区中的代码的情况如下:
- @Karry5307 的代码可以通过。(提交记录)
- @皎月半洒花 的代码求出的最短递归式是正确的。(由于并没有给出完整代码,所以未验证其代码求解 Pm 的正确性)(提交记录)
- @sunnuozhou 的代码有两个点的 Pm 求错了。(提交记录)
- @Alpha1022 的代码有三个点的最短递推式求错了。(提交记录)
如果该题数据有误还烦请告知。
另外,作为一个蒟蒻,我并不知道如何证明上述提到的“正确”做法求出的就是最短递推式,有神仙能证明一下吗?/kel