hdu 2604 Queuing(状态压缩递推,矩阵)

来源:互联网 发布:仿牌外贸seo 编辑:程序博客网 时间:2024/05/29 01:54


hdu 2604 Queuing


和这题一样


#include<stdio.h>#include<string.h>struct matrix{    int m[4][4];};int mod;matrix multi(const matrix &a,const matrix &b){    matrix ans;    memset(&ans,0,sizeof(ans));    for(int i=0;i<4;i++)        for(int k=0;k<4;k++)            if(a.m[i][k])            {                for(int j=0;j<4;j++)                {                    ans.m[i][j]+=a.m[i][k]*b.m[k][j];                    ans.m[i][j]%=mod;                }            }    return ans;}matrix pow(matrix a,int k){    matrix ans;    memset(&ans,0,sizeof(ans));    for(int i=0;i<4;i++) ans.m[i][i]=1;        while(k)    {        if(k&1) ans=multi(ans,a);        a=multi(a,a);        k>>=1;    }    return ans;}int main(){    matrix a;    int n;    while(scanf("%d%d",&n,&mod)!=EOF)    {        if(n<=2)        {            printf("%d\n",1<<n);            continue;        }        memset(&a,0,sizeof(a));        a.m[0][0]=a.m[0][1]=1;        a.m[1][2]=a.m[1][3]=1;        a.m[2][0]=1;        a.m[3][2]=1;        a=pow(a,n-2);        int ans=0;        for(int i=0;i<4;i++)            for(int j=0;j<4;j++)            {                ans+=a.m[i][j];                ans%=mod;            }        printf("%d\n",ans);            }    return 0;}


0 0
原创粉丝点击