矩阵快速幂模板

来源:互联网 发布:唐山地震 知乎 编辑:程序博客网 时间:2024/06/06 01:45

矩阵快速幂模板,可用于求一个递推表达式的f(n)


重载运算符版:


#include<stdio.h>#include<string.h>#include<math.h>#include<string.h>#include<stdlib.h>#include<algorithm>#include<iostream>#include<queue>#include<stack>using namespace std;const double EXP = 1e-9;typedef long long ll;const ll maxn = ;//确定矩阵大小const ll mod =  ;   //取余数用struct mat{    ll m[maxn][maxn];}unit;        //unit为单位矩阵mat operator *(mat a,mat b)   //俩矩阵相乘{    mat ans;    ll x,i,j,k;    for(i=0;i<maxn;i++)    {        for(j=0;j<maxn;j++)        {            x=0;            for(k=0;k<maxn;k++)            {                x+=(a.m[i][k]*b.m[k][j])%mod;            }            ans.m[i][j]=x;        }    }    return ans;}void init_unit()    //初始化单位矩阵{    for(ll i=0;i<maxn;i++)        unit.m[i][i]=1;    return ;}mat pow_mat(mat a,ll n)   //矩阵快速幂,求矩阵a的n次幂{    mat ans=unit;    //unit为幺元    while(n)    {        if(n&1)            ans=ans*a;        a=a*a;        n>>=1;    }    return ans;}int main(){    ll n,x,y;    init_unit();    scanf("%lld",&t);    while(t--)    {        scanf("%lld%lld%lld",&x,&y,&n);//        以下注释代码按具体情况而定//        if(n==)//            printf("\n")//        else if()//        else if()        else        {            mat a,b;   //a为表达式矩阵,b为快速幂矩阵//            以下为俩矩阵的初始化//            b.m[0][0] = ,b.m[0][1] = ,...//            b.m[1][0] = ,...//            ...////            a.m[0][0] = ,...//            ...            b = pow_mat(b,x);//x次幂视具体题目而定            a = a*b;            printf("%lld\n",(a.m[0][0]+mod)%mod);        }    }    return 0;}



无重载运算符版:

#include<stdio.h>#include<string.h>#include<math.h>#include<string.h>#include<stdlib.h>#include<algorithm>#include<iostream>#include<queue>#include<stack>using namespace std;const double EXP = 1e-9;typedef long long ll;const ll maxn =    //确定矩阵大小const ll mod =     //取余数用struct mat{    ll m[maxn][maxn];}unit;   //unit为单位矩阵mat matmul(mat a,mat b)  //俩矩阵相乘{    mat ans;    ll x,i,j,k;    for(i=0;i<maxn;i++)    {        for(j=0;j<maxn;j++)        {            x=0;            for(k=0;k<maxn;k++)            {                x+=(a.m[i][k]*b.m[k][j])%mod;            }            ans.m[i][j] = x%mod;        }    }    return ans;}void init_unit()   //初始化单位矩阵{    for(ll i=0;i<maxn;i++)        unit.m[i][i] = 1;    return ;}mat pow_mat(mat a,ll n)  //矩阵快速幂,求矩阵a的n次幂{    mat ans = unit;  //unit为幺元    while(n)    {        if(n&1)            ans=matmul(ans,a);        a = matmul(a,a);        n>>=1;    }    return ans;}int main(){    ll n,t;    init_unit();    scanf("%lld",&t);    while(t--)    {        scanf("%lld",&n);//        以下注释代码按具体情况而定//        if(n==)//            printf("\n")//        else if()//        else if()        else        {            mat a,b;   //a为表达式矩阵,b为快速幂矩阵//            以下为俩矩阵的初始化//            b.m[0][0] = ,b.m[0][1] = ,...//            b.m[1][0] = ,...//            ...////            a.m[0][0] = ,...//            ...            b = pow_mat(b,x);//x次幂视具体题目而定            a = matmul(a,b);            printf("%lld\n",a.m[0][0]%mod);        }    }    return 0;}


原创粉丝点击