矩阵的快速幂

来源:互联网 发布:ubuntu开机启动项 编辑:程序博客网 时间:2024/05/17 22:11
#include<stdio.h>//我需要构造一个结构来储存矩阵。typedef struct {    long long a[3][3];}matrix;long long fastMod(long long n,long long mod){    matrix t,count;    matrix temp,count2;    t.a[1][1] = 1;    t.a[1][2] = 0;    t.a[2][1] = 0;    t.a[2][2] = 1;    temp.a[1][1] = 1;    temp.a[1][2] = 1;    temp.a[2][1] = 1;    temp.a[2][2] = 0;   // count = t;   //count2 = temp;    while (n != 0){        if (n % 2 == 1){            count.a[1][1]=(temp.a[1][1]*t.a[1][1]%mod+temp.a[1][2]*t.a[2][1]%mod)%mod;           // printf("%lld\t",count.a[1][1]);            count.a[1][2]=(temp.a[1][1]*t.a[1][2]%mod+temp.a[1][2]*t.a[2][2]%mod)%mod;           // printf("%lld\n",count.a[1][2]);            count.a[2][1]=(temp.a[2][1]*t.a[1][1]%mod+temp.a[2][2]*t.a[2][1]%mod)%mod;           // printf("%lld\t",count.a[2][1]);            count.a[2][2]=(temp.a[2][1]*t.a[1][2]%mod+temp.a[2][2]*t.a[2][2]%mod)%mod;           // printf("%lld\n",count.a[2][2]);            t = count;        }       //printf("%Temp :\n");        count2.a[1][1]=(temp.a[1][1]*temp.a[1][1]%mod+temp.a[1][2]*temp.a[2][1]%mod)%mod;       // printf("%lld\t",count2.a[1][1]);        count2.a[1][2]=(temp.a[1][1]*temp.a[1][2]%mod+temp.a[1][2]*temp.a[2][2]%mod)%mod;       // printf("%lld\n",count2.a[1][2]);        count2.a[2][1]=(temp.a[2][1]*temp.a[1][1]%mod+temp.a[2][2]*temp.a[2][1]%mod)%mod;        //printf("%lld\t",count2.a[2][1]);        count2.a[2][2]=(temp.a[2][1]*temp.a[1][2]%mod+temp.a[2][2]*temp.a[2][2]%mod)%mod;        //printf("%lld\n",count2.a[2][2]);        temp = count2;        n /= 2;    }    int i;    //printf("%lld\t%lld\n%lld\t%lld\n",t.a[1][1],t.a[1][2],t.a[2][1],t.a[2][2]);    long long re = (t.a[1][1]+t.a[1][2])%mod;    return re;}int main(){    int t;    scanf("%d",&t);    while (t --){        long long n;        scanf("%lld",&n);        if (n == 1)printf("1\n");        else if(n == 2)printf("1\n");        else printf("%lld\n",fastMod(n-2,10007));    }    return 0;}

这个矩阵的构造比较复杂,所以花费了一点时间。另外,矩阵的运算还有一个小问题。如果直接进行原来的快速幂时

不能自己等于自己乘自己,要先声明一个结构来把值储存起来。

下面就要进行矩阵的运算优化。

matrix multiply(matrix x,matrix y){    matrix temp;    memset(temp.a,0,sizeof(temp.a));    for(int i=0;i<3;i++)        for(int j=0;j<3;j++)            for(int k=0;k<3;k++)                temp.a[i][j]+=x.a[i][k]*y.a[k][j];    return temp;}
这个就厉害了,不需要我那么臃肿的赋值。