nyoj 301 遞推求值 矩陣冪

2021-07-12 01:38:09 字數 1287 閱讀 7009

給你乙個遞推公式:

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

在濤神的協助下構造出來的矩陣:(貌似發表了就格式亂了,空格用"..."表示)

fn..........b...a...1......fn-1

fn-1..=..1...0...0......fn-2

c............0...0...1......c

第一次做矩陣冪的題,自己的理解就是:把二分冪的數與數相乘寫成矩陣與矩陣相乘,矩陣冪適用與含有遞推關係的遞推式。

在乘的過程中需要注意的幾點是:

構造出來的係數矩陣需要先進行二分冪的乘法,再去乘初始的矩陣。

矩陣乘法需要注意是誰乘誰,注意乘的順序(a*b!=b*a)

注意取模

答案的矩陣形式上要和初試矩陣一致

#include #include #include #include using namespace std;

typedef long long ll;

const ll mod = 1000007;

struct matrix

a;matrix mul(matrix t1,matrix t2) ///矩陣乘法,注意取模}}

return tmp;

}matrix cal(matrix res,ll n)

return tmp;

}int main(void)

if(n == 2)

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

a.a[0][0] = b;a.a[0][1] = a;a.a[0][2] = 1; ///構造係數矩陣

a.a[1][0] = 1;

a.a[2][2] = 1;

matrix res;

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

res.a[0][0] = f2; ///初試矩陣

res.a[1][0] = f1;

res.a[2][0] = c;

matrix tmp = cal(res,n-2); ///係數矩陣乘

res = mul(tmp,res); ///再乘初試矩陣輸出(0,0)即fn

printf("%lld\n",res.a[0][0]);

}return 0;

}

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 輸入 第一行是乙個整數t,...