矩阵快速幂---递推题的快速计算

来源:互联网 发布:淘宝刷手有什么危险 编辑:程序博客网 时间:2024/05/22 12:48

昨天晚上矩阵小王子给我们讲了一下矩阵快速幂,学习了一下,写了一个模板。

PS:原创链接

1:思想

矩阵快速幂的思想就是跟数的快速幂一样,假如我们要求2^11,次方,我们可以把 11 写成 1+2+8 ,也就是2^0 + 2^1 + 2^3 。那么把一个O(n)的时间复杂度降到了log(n)

矩阵快速幂的思想和数的快速幂是一模一样的,就是要自己实现矩阵的乘法,然后可以套数的快速幂的模板。


2:难点

矩阵题目的难点在于构造矩阵,一般用于有能够推出递推式的题目,推出递推式之后,发现递推O(n)的复杂度时间比较大,那么我们可以构造一个矩阵,然后用矩阵快速幂降低到log(n)的时间复杂度

比如说nyoj 301

给出这样一个递推式

f(x)=a*f(x-2)+b*f(x-1)+c

然后求f(n),n为10^9

这样直接遍历的时间复杂度肯定是不允许的那么我们就想办法构造一个矩阵]

| a , 1 , 0|   | a , 1 , 0|^(n-2)

|F(n) , F(n-1) ,1 | = | F(n-1) , F(n-2) ,1 | *  | b , 0 , 0| = | f2 ,f1 , 1| *| b , 0 , 0|

|c , 0 , 1 |            |c , 0 , 1 |

那么我们就可以直接用矩阵快幂了。

快速幂模板:


CODE

#include <cstdio>#include <string>#include <cmath>#include <iostream>using namespace std;const long long M = 1000007;const long long N = 3;long long t,b,c,f1,f2;struct Node  //矩阵{    long long line,cal;    long long a[N+1][N+1];    Node(){        line=3,cal=3;        a[0][0] = b; a[0][1] = 1; a[0][2] = 0;        a[1][0] = t; a[1][1] = 0; a[1][2] = 0;        a[2][0] = c; a[2][1] = 0; a[2][2] = 1;    }};Node isit(Node x,long long c)  //矩阵初始化{    for(long long i=0;i<N;i++)        for(long long j=0;j<N;j++)            x.a[i][j]=c;    return x;}Node Matlab(Node x,Node s)  //矩阵乘法{    Node ans;    ans.line = x.line,ans.cal = s.cal;    ans=isit(ans,0);    for(long long i=0;i<x.line;i++)    {        for(long long j=0;j<x.cal;j++)        {            for(long long k=0;k<s.cal;k++)            {                ans.a[i][j] += x.a[i][k]*s.a[k][j];                ans.a[i][j]=(ans.a[i][j]+M)%M;            }        }    }    return ans;}long long Fast_Matrax(long long n)  //矩阵快速幂{    if(n==1)        return f1;    n-=2;    long long x=1,f=n,ok=1;    Node ans,tmp,ch;    ans.line = 1,ans.cal = 3;    ans.a[0][0] = f2, ans.a[0][1] = f1 ,ans.a[0][2] = 1;    while(n>0)    {        if(n%2)        {            ans=Matlab(ans,tmp);        }        tmp=Matlab(tmp,tmp);        n/=2;    }    return ans.a[0][0];}int main(){    long long n,T;    scanf("%lld",&T);    while(T--)    {        scanf("%lld%lld%lld%lld%lld%lld",&f1,&f2,&t,&b,&c,&n);        printf("%lld\n",Fast_Matrax(n));    }    return 0;}


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 头发没了一小块怎么办 改革怎么看我该怎么办 笔记本电脑卡死了怎么办关不了机 电脑卡死了怎么办关不了机 火车上别人占座怎么办 火车上遇到占座怎么办 青少年体力差容易疲劳怎么办 四年级的孩子作业拖拉怎么办 四年级孩子不写作业怎么办 四年级孩子不爱写作业怎么办 四年级的孩子写作业慢怎么办 四年级孩子不想写作业怎么办 四年级孩子写作业特别慢怎么办 6岁儿童睡眠少怎么办 四岁儿童睡眠少怎么办 因睡眠不足第二天没有精神怎么办 睡时间久了头疼怎么办 睡不踏实老醒怎么办 运动过后大腿肌肉酸痛怎么办 牛奶喝多了想吐怎么办 运动过度后吐了怎么办 喝酒后反胃想吐怎么办 拔牙后反胃想吐怎么办 健身完恶心想吐怎么办 锻炼后头晕想吐怎么办 高三学生睡眠不好怎么办 狗狗精力太旺盛怎么办 新入职的同事比你厉害怎么办 银子弹鞋开胶了怎么办 我很笨脑子反应慢怎么办 学车脑子不好使怎么办 生完二胎脑子不好使怎么办 羽毛球鞋买小了怎么办 羽毛球鞋买大了怎么办 感觉自己脑子越来越笨了怎么办? 生完孩子后身体素质差怎么办 胃口太好越来越胖怎么办 心情一紧张心跳手抖怎么办 消防兵新兵连俯卧撑不够怎么办 cf枪王永久禁赛怎么办 换了手机号花呗怎么办