zoukankan      html  css  js  c++  java
  • CodeForces 185A. Plant (矩阵快速幂)

    CodeForces 185A. Plant (矩阵快速幂)

    题意分析

    求解N年后,向上的三角形和向下的三角形的个数分别是多少。如图所示:

    image

    N=0时只有一个向上的三角形,N=1时有3个向上的三角形,1个向下的三角形,N=2,有10个向上的三角形和6个向下的三角形。

    根据递推关系,设an为第N年向上的三角形个数,bn为第N年向下的三角形个数、初始条件为 a0 = 1, b0 = 0;
    递推关系式:
    an = 3an-1 + bn-1
    bn = 3bn-1 + an-1
    可以构造出一下矩阵

    这里写图片描述

    然后用矩阵快速幂即可。

    代码总览

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    #include <sstream>
    #include <set>
    #include <map>
    #include <queue>
    #include <stack>
    #include <cmath>
    #define INF 0x3f3f3f3f
    #define nmax 200
    #define MEM(x) memset(x,0,sizeof(x))
    using namespace std;
    const int Dmax = 11;
    int N = 2;
    long long  MOD;
    typedef struct{
        long long matrix[Dmax][Dmax];
        void init()
        {
            memset(matrix,0,sizeof(matrix));
            for(int i = 0; i<Dmax;++i) matrix[i][i] = 1;
        }
    }MAT;
    
    MAT ADD(MAT a, MAT b)
    {
        for(int i = 0; i<N;++i){
            for(int j = 0;j<N;++j){
                a.matrix[i][j] +=b.matrix[i][j];
                a.matrix[i][j] %= MOD;
            }
        }
        return a;
    }
    MAT MUL(MAT a, MAT b)
    {
        MAT ans;
        for(int i = 0; i<N;++i){
            for(int j = 0; j<N;++j){
                ans.matrix[i][j] = 0;
                for(int k = 0; k<N;++k){
                    ans.matrix[i][j] += ( (a.matrix[i][k])  * (b.matrix[k][j]) ) % MOD;
                }
                ans.matrix[i][j] %= MOD;
            }
        }
        return ans;
    }
    MAT POW(MAT a, long long t)
    {
        MAT ans; ans.init();
        while(t){
            if(t&1) ans = MUL(ans,a);
            t>>=1;
            a = MUL(a,a);
        }
        return ans;
    }
    void OUT(MAT a)
    {
        for(int i = 0; i<N;++i){
            for(int j =  0; j<N;++j){
                printf("%5I64d",a.matrix[i][j]);
            }
            printf("
    ");
        }
    }
    void IN(MAT & a,MAT & ini)
    {
        memset(a.matrix,0,sizeof(a.matrix));
        memset(ini.matrix,0,sizeof(ini.matrix));
        ini.matrix[0][0] = 1;
        ini.matrix[1][0] = 0;
        a.matrix[0][0] = a.matrix[1][1] = 3;
        a.matrix[0][1] = a.matrix[1][0] = 1;
    }
    void CAL(MAT a)
    {
        printf("%I64d
    ",a.matrix[0][0] % MOD);
    }
    int main()
    {
        //freopen("in.txt","r",stdin);
        long long n;MOD = 1000000007;
        while(scanf("%I64d",&n) != EOF){
            MAT temp,ini;
            IN(temp,ini);
            temp = POW(temp,n);
            temp = MUL(temp,ini);
            CAL(temp);
        }
        return 0;
    }
  • 相关阅读:
    万字总结:学习MySQL优化原理,这一篇就够了!
    sql中自连接的使用
    SQL 优化原则
    Thumbnailator java图片压缩,加水印,批量生成缩略图
    java使用Thumbnailator处理图片
    Mysql优化原则_小表驱动大表IN和EXISTS的合理利用
    MySQL千万级多表关联SQL语句调优
    了解MySQL联表查询中的驱动表,优化查询,以小表驱动大表
    【explain】MySQL联表查询中的驱动表
    pyCharm最新2018激活码
  • 原文地址:https://www.cnblogs.com/pengwill/p/7367084.html
Copyright © 2011-2022 走看看