1317 相似字符串对

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值