矩陣快速冪 nyoj301 遞推求值

2021-07-25 20:42:24 字數 1424 閱讀 4835

時間限制:

1000 ms  |  記憶體限制:

65535 kb

難度:4

描述

給你乙個遞推公式:

f(x)=a*f(x-2)+b*f(x-1)+c

並給你f(1),f(2)的值,請求出f(n)的值,由於f(n)的值可能過大,求出f(n)對1000007取模後的值。

注意:-1對3取模後等於2

輸入

第一行是乙個整數t,表示測試資料的組數(t<=10000)

隨後每行有六個整數,分別表示f(1),f(2),a,b,c,n的值。

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

輸出輸出f(n)對1000007取模後的值

樣例輸入

2

1 1 1 1 0 5

1 1 -1 -10 -100 3

樣例輸出

5

999896

構造兩個3*3的矩陣     f2  0    0       b    a   c

f1   0   0  和  1   0   0

1   0   0        0   0   1

code:

//矩陣快速冪

#include#include#include#define mod 1000007

#define n 5

typedef long long ll;

using namespace std;

struct matrix

;matrix unit_matrix =

;//單位矩陣

matrix mul(matrix a,matrix b)//矩陣相乘

return res;

}matrix pow_matrix(matrix a,ll n)//矩陣快速冪

a=mul(a,a);

n>>=1;

}return res;

}int main()

{ int t;

scanf("%d",&t);

while(t--)

{ll a,b,c,f1,f2,n;

cin>>f1>>f2>>a>>b>>c>>n;

matrix a,b,ans;

memset(a.mat,0,sizeof(a.mat));

memset(b.mat,0,sizeof(b.mat));

a.mat[0][0]=f2,a.mat[1][0]=f1,a.mat[2][0]=1;

b.mat[0][0]=b,b.mat[0][1]=a,b.mat[0][2]=c;

b.mat[1][0]=1,b.mat[2][2]=1;

if(n==1)

cout<

NYOJ 301 遞推求值(矩陣快速冪)

時間限制 1000 ms 記憶體限制 65535 kb 難度 4 描述 給你乙個遞推公式 f x a f x 2 b f x 1 c 並給你f 1 f 2 的值,請求出f n 的值,由於f n 的值可能過大,求出f n 對1000007取模後的值。注意 1對3取模後等於2 輸入 第一行是乙個整數t,...

NYOJ 301 遞推求值 矩陣快速冪

時間限制 1000 ms 記憶體限制 65535 kb 難度 4 描述 給你乙個遞推公式 f x a f x 2 b f x 1 c 並給你f 1 f 2 的值,請求出f n 的值,由於f n 的值可能過大,求出f n 對1000007取模後的值。注意 1對3取模後等於2 輸入 第一行是乙個整數t,...

NYOJ301 遞推求值 矩陣快速冪

題目 時間限制 1000 ms 記憶體限制 65535 kb 難度 4 描述 給你乙個遞推公式 f x a f x 2 b f x 1 c 並給你f 1 f 2 的值,請求出f n 的值,由於f n 的值可能過大,求出f n 對1000007取模後的值。注意 1對3取模後等於2 輸入 第一行是乙個整...