概述
题意:在串中不能出现fmf和fff。
思路分析:用Trie图的思想,手动建立Trie图,然后构造矩阵,矩阵的n次幂,就是长度为n的串。
代码如下:
#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<math.h>
#include<cstring>
#include<string>
#define inf 0x3f3f3f3f
#define pi acos(-1.0)
#define eps 10e-6
using namespace std;
int MOD;
struct Matrix
{
int m[10][10];
Matrix()
{
memset(m,0,sizeof(m) );
}
}A,I;
void init()
{
A.m[0][0] = A.m[0][1] = 1;
A.m[1][2] = A.m[1][4] = 1;
A.m[2][0] = 1;
A.m[3][2] = A.m[3][4] = 1;
A.m[4][2] = 1;
A.m[5][2] = 1;
for(int i = 0; i < 10; i++)
for(int j = 0; j < 10; j++)
if(i == j)
I.m[i][j] = 1;
else I.m[i][j] = 0;
}
Matrix matrixmul(Matrix a,Matrix b,int k)
{
Matrix c;
int i,j,o;
for(i = 0; i < k; i++)
for(j = 0; j < k; j++)
for(o = 0;o < k; o++)
c.m[i][j] = (c.m[i][j] + a.m[i][o]*b.m[o][j])%MOD;
return c;
}
Matrix matrixpow(Matrix a,int n,int k)
{
Matrix b = I;
while(n)
{
if(n&1) b = matrixmul(b,a,k);
a = matrixmul(a,a,k);
n/=2;
}
return b;
}
int main()
{
int l,m;
init();
while(scanf("%d%d",&l,&MOD) != EOF)
{
if(l == 0)
printf("0n");
else if(l == 1)
printf("2n");
else if(l == 2)
printf("4n");
else
{
Matrix ans;
ans = matrixpow(A,l,6);
int res = 0;
for(int i = 0; i < 6; i++)
res = (res + ans.m[0][i])%MOD;
printf("%dn",res);
}
}
return 0;
}
最后
以上就是畅快黑米为你收集整理的hdu2604(Trie图的应用)的全部内容,希望文章能够帮你解决hdu2604(Trie图的应用)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复