HDOJ 2604 Queuing

这个也是矩阵2分快速幂

但是重点是找出规律来就好做了

即:f(n)=f(n-1)+f(n-3)+f(n-4)

#include<iostream>
#include<stdio.h>
#include<cmath>
using namespace std;
struct
aa
{

    int
a[4][4];
    void
init()
    {

        a[0][0]=a[0][2]=a[0][3]=a[1][0]=a[2][1]=a[3][2]=1;
        a[0][1]=a[1][1]=a[1][2]=a[1][3]=a[2][0]=a[2][2]=a[2][3]=a[3][0]=a[3][1]=a[3][3]=0;
    }
};

int
mod;
aa f(aa m,aa n)
{

    aa ans;
    for
(int i=0;i<4;i++)
        for
(int j=0;j<4;j++)
        {

            ans.a[i][j]=0;
            for
(int k=0;k<4;k++)
                ans.a[i][j]+=m.a[i][k]*n.a[k][j];
            ans.a[i][j]%=mod;
        }

    return
ans;
}

aa mul(aa m,long k)
{

    aa ans;
    for
(int i=0;i<4;i++)
        for
(int j=0;j<4;j++)
            ans.a[i][j]=(i==j);
    while
(k)
    {

        if
(k&1)
        {

            ans=f(ans,m);
        }

        k>>=1;
        m=f(m,m);
    }

    return
ans;
}

int
main()
{

    long
n,sum;
    while
(scanf("%d%d",&n,&mod)!=EOF)
    {

        aa p,ans;
        sum=0;
        p.init();
        if
(n==0)
            sum=0;
        else
        if
(n==1)
            sum=2;
        else if
(n==2)
            sum=4;
        else if
(n==3)
            sum=6;
        else if
(n==4)
            sum=9;
        else

        {

            ans=mul(p,n-4);
            sum=ans.a[0][0]*9+ans.a[0][1]*6+ans.a[0][2]*4+ans.a[0][3]*2;
        }

        printf("%d\n",sum%mod);
    }

    return
0;
}

你可能感兴趣的:(UI)