nyoj301 遞推求值(矩陣模乘)

2021-08-26 19:00:18 字數 1796 閱讀 2702

前段時間學了學矩陣模乘,大致明白了這個原理。第一次來做這種題,表示寫的非常頭疼!確切說是除錯的很頭疼!

傳奇、、、、、神奇、、、、、嘆為觀止的機器原因又一次重演了。。。。。。搞不清、、、、試試別人的**全部都是測試資料都不對、、、、、

好吧、、、、、

題意:

遞推式:f(x)=a*f(x-2)+b*f(x-1)+c,

給出f(1),f(2),a,b,c,n;求f(n)。0

分析:

很明顯是矩陣模乘。

遞推矩陣f1【f(1),f(2),c】

0 a 0

單位矩陣f2【 1 b 0 】

0 1 1

f(n)就是f1*f2^(n-1)的首元素。

**(不知道可信不,反正ac啦):

#include #include #include using namespace std;

long long f[3][3];

long long ff[3][3];

long long c;long long f1;long long f2;

//計算兩個矩陣的乘積

int calculate(long long a[3][3],long long b[3][3])

} for(i=0;i<3;i++)

return 0;

}//計算矩陣的n次方

void multiply(long long f[3],int n)//遞迴

int main()

else f[0][0]=f1;

printf("%lld\n",(f[0][0]%1000007+1000007)%1000007);

} return 0;

}

額、、、、還是不放心呀、附上乙個同學的**吧

留著當成模板看

#include#include#include#include#define mod 1000007

using namespace std;

class matrix;

void matrix::multiply(long long mat1[3][3],long long mat2[3][3])

}copy(ma,mat1);

}matrix::matrix(int ff1,int ff2,int aa,int bb,int cc,int nn)

long long matrix::calculate()

return (mat[0][0]%mod+mod)%mod;

}void matrix::_binary(int r)

}void matrix::copy(long long mat1[3][3],long long mat2[3][3])

int main()

{ int t,m,n,a,b,c,f1,f2;

cin>>t;

while(t--)

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

matrix mat(f1,f2,a,b,c,n);

cout<

NYOJ301 遞推求值

遞推求值 nyoj上矩陣專題裡的10道題水了ac率最高的5道,慚愧,還不是完全自己寫的,用了幾乎兩周的時間。模板題我是有自信寫出來的,但對於高階一點的矩陣構造,我還是菜的摳腳。這題感謝mql大哥和她女票指點,自己想了一天不會構造矩陣,然後兩位巨巨一起討論了一下,瞬間明白了。此題關鍵就是在於這個矩陣構...

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 遞推求值(矩陣計算)

題目描述 給你乙個遞推公式 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 解題思路 如果單純的用遞推來做的話鐵定超時,因為n可能很大。因此可以將遞推公式轉換成矩陣...