矩阵的快速幂

#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;
}
这个就厉害了,不需要我那么臃肿的赋值。

提示结构体如果是同种类型的可以直接用“=”进行赋值。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值