UVA 10689 Yet another Number Sequence(矩陣快速冪求Fib數列)

題目連接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1630
php


和挑戰程序設計競賽199頁的題目幾乎同樣,將斐波那契數列的遞推式表示成矩陣ios

咱們把矩陣記做A ,則函數

所以只要咱們求出 A^n 就能夠了。這就用到了矩陣快速冪。spa

代碼設計

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <queue>
#include <vector>

using namespace std;
typedef long long ll;
typedef vector<int> vec; // 矩陣的一排
typedef vector<vec> mat; // 矩陣共有幾排
const int maxn = 110010;
int mod;
mat mul(mat&A , mat&B){
    mat C(A.size(),vec(B[0].size())); // A.size() :矩陣A排數,B[0].size() :矩陣B列數
    for(int i=0;i<A.size();i++){
        for(int k=0;k<B.size();k++){  // i k j;
            for(int j=0;j<B[0].size();j++){
                C[i][j] = C[i][j] + A[i][k]*B[k][j];
                C[i][j] %=mod;
            }
        }
    }
    return C;
}
mat pow(mat A,int n){ //快速冪
    mat B(A.size(),vec(A.size()));
    for(int i=0;i<A.size();i++){ // 初始化爲1;
        B[i][i] = 1;
    }
    while(n > 0){
        if(n & 1) B = mul(B,A);
        A = mul(A,A);
        n>>= 1;
    }
    return B;
}
int main(){
    int a,b,n,m,T;
    mat Mar(2,vec(2)); //構造函數 , 2個vec , 每一個的值都是 vec(2);
    scanf("%d",&T);
    while(T--){
        scanf("%d%d%d%d",&a,&b,&n,&m);
        mod = 1;
        while(m--) mod*=10;
        Mar[0][0] = 1;
        Mar[0][1] = 1;
        Mar[1][0] = 1;
        Mar[1][1] = 0;
        Mar = pow(Mar,n-1); //求出n-1 則用 M[0][0] 和 M[0][1]對應的乘 F1 F0就能夠了
        printf("%d\n",(b*Mar[0][0] +a*Mar[0][1])%mod);
    }
    return 0;
}
相關文章
相關標籤/搜索