[WC2016]论战捆竹竿
题意
给定\(n\)长度的字符串,初始数字为\(n\),每次可以给初始数字加上\(|period|~or~n\),求能表示出多少个数\(\in[n,W]\)。\(n\le 5\times 10^5,W\le 10^{18}\)
做法
求period可以求border
\(\{period\}\)可以表示成\(O(log)\)等差数列
等差数列表示成三元组\((fir,d,len)\),分别为首项,公差,项数
可以不断将模\(fir\)意义下的同余最短路
考虑将模\(fir_1\)意义下转移到模\(fir_2\)意义下:\(f_i=\min\limits_{g_j\% fir_2=i}{g_j}\)。有个细节就是还需要用\(f_i+fir_1\)向\(f_{(i+fir_1)\% fir_2}\)转移
现在考虑做\(fir\)意义下的同余最短路,由于转移的长度为\(d\),可以分成\((fir,d)\)个环
有个小trick,每个环最小的位置一定不会再更新,然后转化为序列,然后单调队列