hdu 2604 Queuing

L012345
f(L)1246915

可推出公式f(L) = f(L-1) + f(L-3) + f(L-4)

故構造矩陣來求f(L)。

(f(0),f(1),f(2),f(3))* A^(n - 3) = (f(n-3),f(n-2),f(n-1),f(n))

A = 0 0 0 1

       1 0 0 1

       0 1 0 0

       0 0 1 1

再將結果%MOD即可。

#include<stdio.h>
#include<string.h>

struct mat{
	int m[4][4];
};
mat x,y;
int n,MOD;

void init()
{
	memset(y.m,0,sizeof(y.m));
	for(int i = 0;i < 4;i++)
		y.m[i][i] = 1;
}

mat operator *(mat a,mat b)
{
	mat c;
	for(int i = 0;i < 4;i++)
		for(int j = 0;j < 4;j++)
		{
			c.m[i][j] = 0;
			for(int k = 0;k < 4;k++)
				c.m[i][j] += (a.m[i][k]*b.m[k][j])%MOD;
			c.m[i][j] %= MOD;
		}
		return c;
}

mat Pow(mat a,mat b,int k)
{
	while(k)
	{
		if(k&1)
			b = a*b;
		a = a * a;
		k >>= 1;
	}
	return b;
}

int main()
{
	while(~scanf("%d%d",&n,&MOD))
	{
	    memset(x.m,0,sizeof(x.m));
	    init();
		x.m[0][3] = x.m[1][0] = x.m[1][3] = 1;
		x.m[2][1] = x.m[3][2] = x.m[3][3] = 1;
		mat ret = Pow(x,y,n-3);
		int ans = ret.m[0][3]*1 + ret.m[1][3]*2 + ret.m[2][3]*4 + ret.m[3][3]*6;
		printf("%d\n",ans%MOD);
	}
	return 0;
}





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章