POJ-2440-矩阵

来源:互联网 发布:淘宝如何设置降价通知 编辑:程序博客网 时间:2024/05/05 18:47
const int inf = 0x3f3f3f3f;const int maxn = 1009;const int mod = 2005;const double esp = 1e-6;int x[5][5]={            {1, 1, 0, 0, 0},            {0, 0, 1, 1, 0},            {0, 0, 0, 1, 1},            {1, 0, 0, 0, 1},            {0, 0, 0, 0, 2}};int init[5]={1, 1, 1, 1, 0};int ans[5][5];int tmp[5][5];void mulans(){    int b[5][5];    for(int i=0; i<5; i++)    {        for(int j=0; j<5; j++)        {            b[i][j] = 0;            for(int k=0; k<5; k++)            {                b[i][j] += ans[i][k]*tmp[k][j];                b[i][j] %= mod;            }        }    }    for(int i=0; i<5; i++)    {        for(int j=0; j<5; j++)            ans[i][j] = b[i][j];    }}void multmp(){    int b[5][5];    for(int i=0; i<5; i++)    {        for(int j=0; j<5; j++)        {            b[i][j] = 0;            for(int k=0; k<5; k++)            {                b[i][j] += tmp[i][k]*tmp[k][j];                b[i][j] %= mod;            }        }    }    for(int i=0; i<5; i++)    {        for(int j=0; j<5; j++)            tmp[i][j] = b[i][j];    }}int main(){    int n;    while(~scanf("%d", &n))    {        if(n==1) {cout<<2<<endl;continue;}        n -= 2;        for(int i=0; i<5; i++)        {            for(int j=0; j<5; j++)            {                tmp[i][j] = x[i][j];                ans[i][j] = i==j;            }        }        while(n)        {            //cout<<n<<endl;            if(n&1) mulans();            multmp();            n/=2;        }        int over[5]={0};        for(int i=0; i<5; i++)        {            for(int j=0; j<5; j++)            {                over[i] = (over[i]+ans[i][j]*init[j])%mod;            }                //cout<<i<<' '<<over[i]<<endl;        }        printf("%d\n", (over[0]+over[1]+over[2]+over[3])%mod );    }return 0;}