您的位置:首页 > 产品设计 > UI/UE

HDU 2604 Queuing

2015-07-19 11:07 423 查看
矩阵快速幂

首先我是用暴力DFS算了一下前20项、找到规律F(n)=F(n-1)+F(n-3)+F(n-4)。

接下来运用矩阵快速幂。



#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;

int n;
int m;
int R,C;
struct Matrix
{
int A[10][10];
Matrix operator*(Matrix b);
};

Matrix Matrix::operator*(Matrix b)
{
Matrix c;
memset(c.A,0,sizeof(c.A));
int i,j,k;
for(i=1; i<=R; i++)
for(j=1; j<=C; j++)
for(k=1; k<=4; k++)
c.A[i][j]=((A[i][k]*b.A[k][j])%m+c.A[i][j])%m;
return c;
}

int main()
{
int i,j;
while(~scanf("%d%d",&n,&m))
{
if(0<=n&&n<=4)
{
if(n==0) printf("0\n");
if(n==1) printf("%d\n",2%m);
if(n==2) printf("%d\n",4%m);
if(n==3) printf("%d\n",6%m);
if(n==4) printf("%d\n",9%m);
}
else
{
Matrix c;
for(i=1; i<=4; i++)
for(j=1; j<=4; j++)
{
if(i==j) c.A[i][j]=1;
else c.A[i][j]=0;
}

Matrix a;
a.A[1][1]=1;a.A[1][2]=0;a.A[1][3]=1;a.A[1][4]=1;
a.A[2][1]=1;a.A[2][2]=0;a.A[2][3]=0;a.A[2][4]=0;
a.A[3][1]=0;a.A[3][2]=1;a.A[3][3]=0;a.A[3][4]=0;
a.A[4][1]=0;a.A[4][2]=0;a.A[4][3]=1;a.A[4][4]=0;

R=4;C=4;
int b=n-4;
while(b!=0)
{
if(b%2==1) c=c*a,b--;
else a=a*a,b=b/2;
}

Matrix B;
B.A[1][1]=9;B.A[2][1]=6;
B.A[3][1]=4;B.A[4][1]=2;
R=4; C=1;
Matrix ans;
ans=c*B;
printf("%d\n",ans.A[1][1]);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: