ACM日记_17.5.01——矩阵快速幂整理(例题i:Fibonacci POJ - 3070)

本文介绍了一个简单的矩阵快速幂实现模板,适用于求解特定类型的数学问题。通过递归地将矩阵进行平方并累加的方式,实现了对矩阵的快速幂运算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原题略,主要考察的是矩阵快速幂的做法,直接输出结果就好,灰常适合做模板!遂记录之!

#include <stdio.h>  
    #include <math.h>  
    #include <vector>  
    #include <queue>  
    #include <string>  
    #include <string.h>  
    #include <stdlib.h>  
    #include <iostream>  
    #include <algorithm>  
    #define Mod 10000  
      
    using namespace std;  
      
    int res[5][5];  
    int mat[5][5];  
      
    void Matmul(int x[5][5],int y[5][5])  
    {  
        int t[5][5]={0};  
        for(int i=0;i<2;i++){  
            for(int k=0;k<2;k++){  
                if(x[i][k]){  
                    for(int j=0;j<2;j++)  
                        t[i][j]=(t[i][j]+(x[i][k]*y[k][j]))%Mod;  
                }  
            }  
        }  
        for(int i=0;i<2;i++){  
            for(int j=0;j<2;j++){  
                x[i][j]=t[i][j];  
            }  
        }  
    }  
      
    void Matrix(int x[5][5],int n)  
    {  
        for(int i=0;i<2;i++){  
            for(int j=0;j<2;j++){  
                res[i][j]=(i==j);  
            }  
        }  
        while(n){  
            if(n&1)Matmul(res,x);  
            Matmul(x,x);  
            n>>=1;  
        }  
    }  
      
    int main()  
    {  
        int n;  
        while(scanf("%d",&n)!=EOF){  
            mat[0][0]=mat[0][1]=mat[1][0]=1;  
            mat[1][1]=0;  
            if(n==-1)break;  
            if(n==0){  
                printf("0\n");  
                continue;  
            }  
      
            Matrix(mat,n);  
            printf("%d\n",res[0][1]);  
        }  
        return 0;  
    }  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值