矩阵快速幂(new 模板

第一种
ju jumul(ju a,ju b)
{//矩阵乘法
    int i,j,k;
    ju c;
    c.CSH();
    for(i=0;ifor(j=0;jif(a.a[i][j])
                for(k=0;kmod;
    return c;
}
适用于小矩阵,高次幂

第二种
ju jumul(ju a,ju b)  
{//矩阵乘法  
    int i,j,k;  
    ju c;  
    for(i=0;ifor(j=0;j0;  
    for(i=0;ifor(j=0;jfor(k=0;kmod;  
        }  
    }  
    return c ;  
}  
适用于大矩阵,幂比较小的
typedef long long ll;
const ll mod=1e6;
const int maxn=2;
struct ju
{//矩阵
    ll a[maxn][maxn];
    void init()
    {//初始化
        for(int i=0;ifor(int j=0;j0;
        for(int i=0;i1;
    }
    void CSH()
    {
        for(int i=0;ifor(int j=0;j0;
    }
};
ju juadd(ju a,ju b)
{//矩阵加法
    int i,j;
    ju c;
    for (i=0;ifor (j=0;jreturn c;
}
ju jumul(ju a,ju b)
{//矩阵乘法
    int i,j,k;
    ju c;
    c.CSH();
    for(i=0;ifor(j=0;jif(a.a[i][j])
                for(k=0;kreturn c;
}
template<typename T>
ju fastshe(ju s,T k)
{//矩阵的k次方,快速幂
    ju ans;
    ans.init();
    for(;k>0;k>>=1)
    {
        if(k&1)
            ans=jumul(ans,s);
        s=jumul(s,s) ;
    }
    return ans;
}
template<typename T>
ju sss(ju s,T k)
{//(求A+A^2+A^3+....+A^k)
    if (k==1)
        return s;
    ju tmp;
    tmp.init();
    tmp=juadd(tmp,fastshe(s,k>>1));
    tmp=jumul(tmp,sss(s,k>>1));
    if (k&1)
        tmp=juadd(tmp,fastshe(s,k));
    return tmp;
}

你可能感兴趣的:(矩阵快速幂)