题意
称一对字符串(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]=