做这个题之前最好做一下POJ 2278(题解)
在POJ2278的基础上,
最终的答案就是26^1+26^2+......+26^L减去A^1+A^2+....+A^L
我们构造这么一个矩阵
|A , 1|
|0 , 1| 它 的n次方等于
|A^n , 1+A^1+A^2+....+A^(n-1)|
|0 , 1|
如果A是一个矩阵 那么1 和 0 也分别是[1 1 1... 1]T 和 [0 0 0.... 0]
那么结果是
|A^n , (1+A^1+A^2+....+A^(n-1))*[1 1 1 .. 1]T |
|[0 0 0 ...0] , 1 |
因为我们要求∑a[0][i],所以结果的第一行就是我们需要的,因为多加了一个一,减去就可以了。
#include
#include
#include
#include
#include
#include
#include
#define LL long long
#define ULL unsigned long long
#define INF 0x3f3f3f3f
using namespace std;
int n;char str[10];LL k;
struct matrix{ULL a[33][33];}X;
struct Trie
{
int next[33][26],fail[33],end[33];
int root,L;
int newnode()
{
for(int i = 0;i < 26;i++)
next[L][i] = -1;
end[L++] = 0;
return L-1;
}
void init(){L = 0;root = newnode();}
void insert(char buf[])
{
int len = strlen(buf);
int now = root;
for(int i = 0;i < len;i++)
{
if(next[now][buf[i]-'a'] == -1)
next[now][buf[i]-'a'] = newnode();
now = next[now][buf[i]-'a'];
}
end[now]=1;
}
void build()
{
queueQ;
fail[root] = root;
for(int i = 0;i < 26;i++)
if(next[root][i] == -1)
next[root][i] = root;
else
{
fail[next[root][i]] = root;
Q.push(next[root][i]);
}
while( !Q.empty() )
{
int now = Q.front();
Q.pop();
if(end[fail[now]])
end[now]=1;
for(int i = 0;i < 26;i++)
if(next[now][i] == -1)
next[now][i] = next[fail[now]][i];
else
{
fail[next[now][i]]=next[fail[now]][i];
Q.push(next[now][i]);
}
}
}
}ac;
matrix multi(matrix A,matrix B,int n)
{
matrix C;
memset(C.a,0,sizeof(C.a));
int i,j,k;
for(i=0;i>=1;
}
return ans;
}
matrix getmatrix(matrix A)
{
memset(A.a,0,sizeof(A));
for(int i=0;i