給你乙個遞推公式:
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,...