PE 458

http://projecteuler.net/problem=458

 

题意:由”project”这些字母构成的长度为n的字符串,且其任何子串都不为”project”的任意排列,问这样的字符串有多少种。当n=10^12时,这样的字符串有多少。

 

首先想到的是DP,以dp[i][j]表示字符串的第i个字符之前的j个字符构成project中任意j个字符的排列。则当j>=1时,有两种情况。

  1. 这个字符之前已经构成了长度为j-1的排列,所以这个字符可以填入除了这j-1个字符以外的任意字符。这种情况所构成的字符串有dp[i-1][j-1]*(7-j+1)种;
  2. 这个字符之前已经构成了长度为k>j的排列,而这个字符刚好与第i-j个字符相同,所以i-j+1到j这段子串构成了新的排列,而第i-j个字符因为与第j个字符相同,所以不构成排列。这种情况所构成的字符串有种。

 

因为字符串使用的是project中的任意字母,所以任意一个长度为1的子串都是project中任意1个字符的排列。最终答案为

题目要求计算n=10^12,无论从时间还是空间上上面算法都不可取。把上面的方法转换为矩阵乘法。

假设是有dp[i][j]所组成的长度为6的列向量。。则有

。最后通过矩阵快速幂,便能很快的求得答案,算法复杂度为O(logn)

posted @ 2014-03-06 13:30  三吉鬼  阅读(141)  评论(0)    收藏  举报