[WC2016]论战捆竹竿

题意

给定(n)长度的字符串,初始数字为(n),每次可以给初始数字加上(|period|~or~n),求能表示出多少个数(in[n,W])(nle 5 imes 10^5,Wle 10^{18})

做法

求period可以求border
({period})可以表示成(O(log))等差数列
等差数列表示成三元组((fir,d,len)),分别为首项,公差,项数
可以不断将模(fir)意义下的同余最短路
考虑将模(fir_1)意义下转移到模(fir_2)意义下:(f_i=minlimits_{g_j\% fir_2=i}{g_j})。有个细节就是还需要用(f_i+fir_1)(f_{(i+fir_1)\% fir_2})转移
现在考虑做(fir)意义下的同余最短路,由于转移的长度为(d),可以分成((fir,d))个环
有个小trick,每个环最小的位置一定不会再更新,然后转化为序列,然后单调队列

原文地址:https://www.cnblogs.com/Grice/p/13098307.html