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)的值。