1317 相似字符串对

来源:互联网 发布:怎么看淘宝信誉评级 编辑:程序博客网 时间:2024/05/06 06:58

51nod:相似字符串


根据题意要求所有满足题意的相似字符串对数,相似字符串对满足A+C=C+B,进一步分析能得到A,B字符串必须满足A=D+E,B=E+D。

这时候只要构造满足要求的A,B。

可以看出,A有K^N种情形,B只要根据A进行对应的变化就行(将A前后两部分对调位置),不过可能出现重复情形。这时候只要想办法剔除重复情形

,分析出现重复的情况,即F=G+H,I=H+G,F=I,可以发现这种情形下F=I是有循环节的字符串。


字符串的循环节有一些性质。

1. S字符串若有长度为L的循环节P,则无论怎么将S字符串的前后2部分对调位置,变换后的字符串仍然有长度为L的循环节P

2. S字符串的最小循环节长度为L,则S字符串的所有可能循环节长度均为L的倍数。


根据上面的性质,可以知道,对于固定的字符串A,其最小循环节长度若为L,则对应的相似字符串就有L种。


令f(p)为最小循环节为p的长度为N的字符串个数

则最终结果公式为:

ans = SUM{ p*f(p) | n%p==0 }


问题转化为求f(p)最小循环节为p的长度为N的字符串个数。

长度为N的字符串总数k^n种,可以按照最小循环节长度进行分类,这几类的字符串集合之间必然两两没有交集。可以列出下面公式:

 SUM{ f(p) | n%p==0 }=k^n


利用上面的公式,就能不断递推最终求得所有f(p)的值



程序实现流程为:

1.用线性筛素数法求得所有质数,得到n的所有质因子。

2.得到n的所有的因子,并按从小到大排序。

3.进行递推,求得所有这些因子p的f(p)的值。







0 0
原创粉丝点击