快速矩阵幂模板

来源:互联网 发布:搜索引擎怎么数据分析 编辑:程序博客网 时间:2024/05/17 00:08

fn = b*fn-1 +a*fn-2 +c

#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
原创粉丝点击