nyoj301 遞推求值(矩陣快速冪)

題目鏈接:

http://acm.nyist.net/JudgeOnline/problem.php?pid=301

題目大意:

計算遞推式f(x)=a*f(x-2)+b*f(x-1)+c,求f(n)。

範圍:

0<=f(1),f(2)<100,-100<=a,b,c<=100,1<=n<=100000000 (10^9)

思路:

由於n很大,所以不能夠直接採用遞推的方法。

由於是一個方程式,所以可以轉化爲矩陣乘法,又是一個遞推式,就想到用矩陣快速冪解決。

矩陣快速冪:

就是矩陣的快速乘法,跟數的求快速冪是一樣的。

--------------------------------------------------------------------------------------------------------------

所以這個遞推式可以轉化爲矩陣A

b a c

1 0 0

0 0 1

和矩陣B

f2

f1 

1

的乘積A*B.

得到的就是答案f(3)。

然後我們就可以通過遞推的方式計算出f(n)。可以知道f(n)=A^(n-2)*B,利用矩陣快速冪算出A^(n-2),就解決問題了。

代碼:

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
#define n 100
#define ll long long
#define mod 1000007
using namespace std;
struct Mat{
 ll mat[5][5];
};
int ss;
Mat operator * (Mat a, Mat b) {
    Mat c;
    memset(c.mat, 0, sizeof(c.mat));
    int i, j, k;
    for(k = 0; k < 4; ++k) {
        for(i = 0; i < 4; ++i) {
            for(j = 0; j < 4; ++j) {
                c.mat[i][j] += (a.mat[i][k] * b.mat[k][j]);
                c.mat[i][j]=(c.mat[i][j]+mod)%mod;
            }
        }
    }
    return c;
}
Mat operator ^ (Mat a, ll k) {
    Mat c;
    int i, j;
    for(i = 0; i < 4; ++i)
        for(j = 0; j < 4; ++j)
            c.mat[i][j] = (i == j);    //初始化爲單位矩陣

    for(; k; k >>= 1) {
        if(k&1) c = c*a;

        a = a*a;
    }
    return c;
}
int main()
{
    Mat x,y;
    int i,j,k,N,T,f1,f2,a,b,c;
    scanf("%lld",&T);
    while(T--)
    {
        scanf("%d%d%d%d%d%d",&f1,&f2,&a,&b,&c,&N);
        memset(x.mat,0,sizeof(x.mat));
        memset(y.mat,0,sizeof(y.mat));
        x.mat[1][1]=b;
        x.mat[1][2]=a;
        x.mat[1][3]=c;
        x.mat[2][1]=1;
        x.mat[2][2]=0;
        x.mat[2][3]=0;
        x.mat[3][3]=1;
        y.mat[1][1]=f2;
        y.mat[2][1]=f1;
        y.mat[3][1]=1;
    //    scanf("%d",&N);
    if(N==1){
        printf("%d\n",f1);
        continue;
    }
        x=x^(N-2);
        x=x*y;
        printf("%lld\n",(x.mat[1][1]+mod)%mod);
    }
}
 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章