#include<iostream>
#include<cstdio>
#include<string.h>
#include<string>
#include<stack>
#include<set>
#include<algorithm>
#include<cmath>
#include<vector>
#include<map>
#define ll __int64
#define lll unsigned long long
#define MAX 1000009
#define eps 1e-8
#define INF 0xfffffff
#define mod 1000000007
/*
题意:矩阵快速幂
想法:
考虑第n中,如果在第n-1中后面加m的话,就有f(n-1)中,如果加f的话还得考虑f(n-1)末尾的字母,如果f(n-1)末尾两位是mm和mf的话,
在后面再加上f是不会出现O型的,mm型的好说,就是f(n-3)的后面加上mm就可以了,
如果是mf的话还得考虑必须得是f(n-4)的后面加上mmf,所以总结为f(n)=f(n-1)+f(n-3)+f(n-4).
*/
const int N = 4;
int M;
struct Matrix
{
int mat[N][N];
};
Matrix mul(Matrix a, Matrix b) //矩阵相乘
{
Matrix res;
for(int i = 0; i < N; i++)
for(int j = 0; j < N; j++)
{
res.mat[i][j] = 0;
for(int k = 0; k < N; k++)
{
res.mat[i][j] += a.mat[i][k] * b.mat[k][j];
res.mat[i][j] %= M;
}
}
return res;
}
Matrix pow_matrix(Matrix a,Matrix res,int n) //矩阵快速幂
{
while(n != 0)
{
if(n & 1)
res = mul(res, a);
a = mul(a, a);
n >>= 1;
}
return res;
}
int main()
{
int d = 1;
int n, a, b, c;
int L;
Matrix arr;//构造矩阵
Matrix unit_matrix;//单位矩阵
while(scanf("%d%d",&L,&M)!=EOF)
{
if(L==1)
{
printf("%d\n",2%M);
continue;
}
if(L==2)
{
printf("%d\n",4%M);
continue;
}
if(L==3)
{
printf("%d\n",6%M);
continue;
}
if(L==4)
{
printf("%d\n",9%M);
continue;
}
memset(arr.mat, 0, sizeof(arr.mat));
memset(unit_matrix.mat, 0, sizeof(unit_matrix.mat));
unit_matrix.mat[0][0] = 9;
unit_matrix.mat[0][1] = 6;
unit_matrix.mat[0][2] = 4;
unit_matrix.mat[0][3] = 2;
arr.mat[0][0] = 1;
arr.mat[0][1] = 1;
arr.mat[1][2] = 1;
arr.mat[2][0] = 1;
arr.mat[2][3] = 1;
arr.mat[3][0] = 1;
Matrix p = pow_matrix(arr, unit_matrix, L-4);
printf("%d\n",p.mat[0][0]%M);
}
return 0;
}
(2604)HDU
最新推荐文章于 2020-07-08 19:22:33 发布
387

被折叠的 条评论
为什么被折叠?



