zoukankan      html  css  js  c++  java
  • HDU 2604 Queuing

    矩阵快速幂

    首先我是用暴力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
    ");
                if(n==1) printf("%d
    ",2%m);
                if(n==2) printf("%d
    ",4%m);
                if(n==3) printf("%d
    ",6%m);
                if(n==4) printf("%d
    ",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
    ",ans.A[1][1]);
            }
        }
        return 0;
    }
  • 相关阅读:
    Ubuntu Server下docker实战 02: docker进阶配置
    Ubuntu Server下docker实战 01: 安装docker
    简单一个方法实现商品组合管理--递归笛卡尔
    Little-Endian小字节序
    BinaryWriter和BinaryReader用法
    C#位运算
    TCP协议三次握手过程分析
    简述HTTP过程
    c# 版贪食蛇
    今日头条列表json
  • 原文地址:https://www.cnblogs.com/zufezzt/p/4658348.html
Copyright © 2011-2022 走看看