zoukankan      html  css  js  c++  java
  • POJ3420Quad Tiling(矩阵快速幂)

    Quad Tiling

    Time Limit: 1000MS Memory Limit: 65536K
    Total Submissions: 3740 Accepted: 1684
    Description

    Tired of the Tri Tiling game finally, Michael turns to a more challengeable game, Quad Tiling:

    In how many ways can you tile a 4 × N (1 ≤ N ≤ 109) rectangle with 2 × 1 dominoes? For the answer would be very big, output the answer modulo M (0 < M ≤ 105).

    Input

    Input consists of several test cases followed by a line containing double 0. Each test case consists of two integers, N and M, respectively.

    Output

    For each test case, output the answer modules M.

    Sample Input

    1 10000
    3 10000
    5 10000
    0 0
    Sample Output

    1
    11
    95
    Source

    POJ Monthly–2007.10.06, Dagger

    递推式:a[i]=a[i-1]+5*a[i-2]+a[i-3]-a[i-4];

    由于N高达10^9,所以要用矩阵进行优化。
    |0 1 0 0|
    |0 0 1 0|
    |0 0 0 1|
    |-1 1 5 1|

    |a[i-3]|
    |a[i-2]|
    |a[i-1]|
    |a[i]|
    相乘

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <queue>
    #include <cstdlib>
    #include <algorithm>
    #define LL long long
    
    using namespace std;
    const int  Max = 10;
    
    int Mod;
    struct Matrix
    {
        int n,m;
        int a[Max][Max];
        void clear()//清空矩阵
        {
            n=0;
            m=0;
            memset(a,0,sizeof(a));
        }
        Matrix operator * (const Matrix &b)const//矩阵相乘
        {
            Matrix tmp;
            tmp.clear();
            tmp.n=n;
            tmp.m=b.m;
            for(int i=0;i<n;i++)
            {
                for(int j=0;j<b.m;j++)
                {
                    for(int k=0;k<m;k++)
                    {
                        tmp.a[i][j]=(tmp.a[i][j]+(a[i][k]%Mod)*(b.a[k][j]%Mod))%Mod;
                    }
                }
            }
            return tmp;
        }
    };
    
    
    
    void Pow(int m)
    {
        Matrix s;
        s.clear();
        s.n=4;
        s.m=4;
        s.a[3][3]=1;s.a[3][2]=5;
        s.a[3][1]=1;s.a[3][0]=-1;
        s.a[1][2]=1;s.a[2][3]=1;
        s.a[0][1]=1;
    
        Matrix ans;
        ans.clear();
        ans.n=4;
        ans.m=1;
        ans.a[0][0]=1;
        ans.a[1][0]=5;
        ans.a[2][0]=11;
        ans.a[3][0]=36;
        while(m)//快速幂
        {
            if(m&1)
            {
                ans=s*ans;
            }
            s=s*s;
            m>>=1;
        }
        printf("%d
    ",ans.a[3][0]);
    }
    
    int main()
    { 
        int n;
        while(scanf("%d %d",&n,&Mod),n)
        {
            if(n<4)
            {
                switch(n)
                {
                    case 1:
                        printf("%d
    ",1%Mod);
                        break;
                    case 2:
                        printf("%d
    ",5%Mod);
                        break;
                    case 3:
                        printf("%d
    ",11%Mod);
                        break;
                }
                continue;
            }
            Pow(n-4);
        }
        return 0;
    }
  • 相关阅读:
    Go的50坑:新Golang开发者要注意的陷阱、技巧和常见错误[2]
    Go的50坑:新Golang开发者要注意的陷阱、技巧和常见错误[1]
    进程和线程
    Linux 技巧:让进程在后台可靠运行的几种方法
    Linux 网络命令必知必会之 tcpdump,一份完整的抓包指南请查收!
    这些好用的 Chrome 插件,提升你的工作效率
    golang学习笔记-go mod的使用
    性能监控和分析工具---nmon
    Jenkins
    程序员画图工具总结
  • 原文地址:https://www.cnblogs.com/juechen/p/5255898.html
Copyright © 2011-2022 走看看