Codeforces - 185A 简单矩阵快速幂

题意:求第n个三角形内部的上三角形个数

对每个三角形分别维护上下三角形个数,记为\(dp[1][i],dp[2][i]\)

规律很明显是

\(dp[1][i+1]=3*dp[1][i]+dp[2][i]\)

\(dp[2][i+1]=3*dp[2][i]+dp[1][i]\)

别忘了快速幂里也要long long,白送了个TLE

/*H E A D*/
inline ll mod(ll a){return a%MOD;}
struct Matrix{
    ll mt[5][5],r,c;
    void init(int rr,int cc,bool flag=0){
        r=rr;c=cc;
        memset(mt,0,sizeof mt);
        if(flag) rep(i,1,r) mt[i][i]=1;
    }
    Matrix operator * (const Matrix &rhs)const{
        Matrix ans; ans.init(r,rhs.c);
        rep(i,1,r){
            rep(j,1,rhs.c){
                int t=max(r,rhs.c);
                rep(k,1,t){
                    ans.mt[i][j]+=mod(mt[i][k]*rhs.mt[k][j]);
                    ans.mt[i][j]=mod(ans.mt[i][j]);
                }
            }
        }
        return ans;
    }
};
Matrix fpw(Matrix A,ll n){
    Matrix ans;ans.init(A.r,A.c,1);
    while(n){
        if(n&1) ans=ans*A;
        n>>=1;
        A=A*A;
    }
    return ans;
}

int bas[3][3]={
    {0,0,0},
    {0,3,1},
    {0,1,3},
};
int bas2[3]={0,1,0};
ll n;
int main(){
    Matrix A;A.init(2,2);
    rep(i,1,2) rep(j,1,2) A.mt[i][j]=bas[i][j];
    Matrix b; b.init(2,1);
    rep(i,1,2) b.mt[i][1]=bas2[i];
    while(cin>>n){
        Matrix res=fpw(A,n); res=res*b;
        ll ans=mod(res.mt[1][1]);
        println(ans);
    }
    return 0;
}

原文地址:https://www.cnblogs.com/caturra/p/8449551.html

时间: 2024-08-28 06:02:16

Codeforces - 185A 简单矩阵快速幂的相关文章

CodeForces 185A Plant 矩阵快速幂

题意:最开始给你一个正三角形,每一步,一个正三角形可以变成三个正三角形和一个反三角形,而一个反三角形可以构成一个正三角形和三个反三角形,问额你n步之后一共有多少个正三角形. 解题思路:因为n太大,有10^18这么大,所以我们只能用矩阵快速幂来求. 中间矩阵为 3 1 1 3 初始矩阵为 0 (负) 1 (正) 解题代码: 1 // File Name: temp.cpp 2 // Author: darkdream 3 // Created Time: 2014年09月17日 星期三 11时35

HDU3306Another kind of Fibonacci(简单矩阵快速幂)

哎,本来是想学学矩阵构造的方法的,,突然发现自己不用看直接就会yy构造... 看下右边有什么.. 题目地址:Another kind of Fibonacci AC代码: #include<iostream> #include<cstdio> #include<cstring> #include<string> using namespace std; const int mod=10007; int p[4][4],a[4][4],tmp[4][4]; i

UVA10870—Recurrences(简单矩阵快速幂)

题目链接:https://vjudge.net/problem/UVA-10870 题目意思: 给出a1,a2,a3,a4,a5------ad,然后算下面这个递推式子,简单的矩阵快速幂,裸题,但是第一个次遇到了矩阵大小不确定的矩阵快速幂,而且在这道题里面第一次明白了如何构造矩阵.算是矩阵快速幂的学习的一个小里程碑吧. f(n) = a1 *f(n - 1) + a2 *f(n - 2) + a3 *f(n - 3) + - + ad* f(n - d),  n > d.求f(n) 代码: 1

CodeForces 450B (矩阵快速幂模板题+负数取模)

题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=51919 题目大意:斐波那契数列推导.给定前f1,f2,推出指定第N项.注意负数取模的方式:-1%(10^9+7)=10^9+6. 解题思路: 首先解出快速幂矩阵.以f3为例. [f2]  * [1 -1] = [f2-f1]=[f3]  (幂1次) [f1]  * [1  0]     [f2]      [f2] 于是fn=[f2] *[1 -1]^(n-2)

ZOJ 2853 Evolution 【简单矩阵快速幂】

这道题目第二次看的时候才彻底理解了是什么意思 把题目转化为数学模型分析后就是 有一个初始序列, 有一个进化率矩阵 求的是初始序列 与进化率矩阵进行 m 次运算后, 初始序列最后一位的答案 那么显然,可以对进化率矩阵进行快速幂计算 Example Let's assume that P(0, 1) = P(1, 2) = 1, and at the beginning of a sub-process, the populations of 0, 1, 2 are 40, 20 and 10 re

HDU - 1005 Number Sequence(简单矩阵快速幂)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1005 题意:f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7. 就是这道题目,然而找了一晚上的错误 \("▔□▔)/\("▔□▔)/\("▔□▔)/. 1 #include <iostream> 2 #include <cstring> 3 using namespace std;

hdu------(1757)A Simple Math Problem(简单矩阵快速幂)

A Simple Math Problem Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2791    Accepted Submission(s): 1659 Problem Description Lele now is thinking about a simple function f(x). If x < 10 f(x) =

垒骰子(矩阵快速幂)

题目描述: 赌圣atm晚年迷恋上了垒骰子,就是把骰子一个垒在另一个上边,不能歪歪扭扭,要垒成方柱体. 经过长期观察,atm 发现了稳定骰子的奥秘:有些数字的面贴着会互相排斥! 我们先来规范一下骰子:1 的对面是 4,2 的对面是 5,3 的对面是 6. 假设有 m 组互斥现象,每组中的那两个数字的面紧贴在一起,骰子就不能稳定的垒起来.  atm想计算一下有多少种不同的可能的垒骰子方式. 两种垒骰子方式相同,当且仅当这两种方式中对应高度的骰子的对应数字的朝向都相同. 由于方案数可能过多,请输出模

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

题目链接:http://codeforces.com/problemset/problem/185/A Dwarfs have planted a very interesting plant, which is a triangle directed "upwards". This plant has an amusing feature. After one year a triangle plant directed "upwards" divides int