HDU第一届“蔬菜 - 鸟类杯”编程公开赛
题意:给你L的长度的字符(只包含mf)求出E-queues mod M.
可以推出f(n)= f(n-1)+ f(n-3)+ f(n-4);
所以我们维护f(n)f(n-1)f(n-2)f(n-3)f(n-4)的值
AC代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define llp 4
ll mod,n;
struct matrix
{
ll arr[llp+1][llp+1];
void clear()
{
memset(arr,0,sizeof(arr));
}
matrix operator *(const matrix &B) const
{
matrix C;
C.clear();
for(int i=1; i<=llp; i++)
{
for(int j=1; j<=llp; j++)
{
for(int k=1; k<=llp; k++)
{
C.arr[i][j]=(C.arr[i][j]+(arr[i][k]*B.arr[k][j])%mod)%mod;
}
}
}
return C;
}
};
matrix matrixPow(ll n,matrix B)
{
matrix A;A.clear();
for(int i=1; i<=llp; i++)
{
A.arr[i][i]=1;
}
while(n)
{
if(n&1)
A=A*B;
B=B*B;
n>>=1;
}
return A;
}
int main()
{
while(scanf("%lld%lld",&n,&mod)!=EOF)
{
matrix x,y;x.clear();y.clear();
x.arr[1][1]=x.arr[1][3]=x.arr[1][4]=x.arr[2][1]=x.arr[3][2]=x.arr[4][3]=1;
y.arr[1][1]=9;y.arr[2][1]=6;y.arr[3][1]=4;y.arr[4][1]=2;
if(n > 4)
{
n=n-4;
matrix res = matrixPow(n,x);
matrix ans = res*y;
printf("%lld\n",ans.arr[1][1]);
}
else if(n == 0)
printf("0\n");
else
{
printf("%lld\n",y.arr[4-n+1][1]%mod);
}
}
return 0;
}