51nod 1317 相似字符串对 容斥原理+数学

该博客介绍了如何判断两个字符串是否相似,以及在给定条件下求解相似字符串对的数量。通过分析字符串的循环节和利用容斥原理,可以计算出满足条件的不同字符串对。博客中提供了问题的详细解释、思路分析以及代码实现。
摘要由CSDN通过智能技术生成

题意

称一对字符串(A,B)是相似的,当且仅当满足以下条件:
(1)字符串A和B都恰好包含N个字符;
(2)A和B串中的每个字符都是小写字母的前k个字符,即A、B中只可能出现’a’,’b’,’c’,…,(’a’+k-1)这k个字符;
(3)存在一个字符串C,满足:A+C=C+B。这里的“+”号表示字符串间的链接,即str1+str2 = str1str2,如:“aaa”+“csd”=“aaacsd”。
例如,N=3,k=4那么(”aad”,”daa”)就是相似字符串对。
因为C=”aa”时,有”aad”+”aa”=”aadaa”=”aa”+”daa”.
现在给出N与k,问有多少种不同的相似字符串对,输出这个结果 mod 1,000,000,007的值。
说明:两个字符串对(A,B)与(C,D)是不同的,只要 A!=C 或 B!= D。
1<=N<=1,000,000,000,1<=k<=26

分析

分析一下两个字符串相似的条件不难得出实际上就是问有多少个字符串对(A,B)使得A和B循环同构。
显然对于一个循环节为T的串A,共有T个不同的串B使得A和B循环同构。
考虑枚举循环节。因为循环节必然是n的因数,所以先把n的所有因数求出来。不难发现n的因数个数最多只有1000个左右。
设f[i]表示循环节恰好为i的字符串有多少个。 f[i]=

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值