遞推求值
nyoj上矩陣專題裡的10道題水了ac率最高的5道,慚愧,還不是完全自己寫的,用了幾乎兩周的時間。模板題我是有自信寫出來的,但對於高階一點的矩陣構造,我還是菜的摳腳。
這題感謝mql大哥和她女票指點,自己想了一天不會構造矩陣,然後兩位巨巨一起討論了一下,瞬間明白了。此題關鍵就是在於這個矩陣構造。
題意:給出m斐波那契的前兩項f[1],f[2],以及遞推式:f(x)=a*f(x-2)+b*f(x-1)+c
中的a,b,c,和n.求f[n]%1000007。
很裸的矩陣快速冪,但怎麼構造這個矩陣呢。摘用遠航學長的部落格來解釋吧:
分析:由於n的值比較大,所以常規方法肯定會超時。根據遞推式求第n個表示式的值時,通常用矩陣乘法來做。
本題要構造兩個矩陣,其中乙個為矩陣a,作為初始矩陣
即:假設初始矩陣為a,那麼每次都需要乘以下乙個矩陣b來得到下一項。
而:f[n]=a*f[n-2]+b*f[n-1]+c,f[n-1]=1*f[n-1]+0*f[n-2]+0*c,c=0*f[n-1]+0*f[n-2]+1*c;
a| f2 0 0 |
| f1 0 0 |
| 1 0 0 |
b| b a c |
| 1 0 0 |
| 0 0 1 |
因為f(2)和f(1)是已知的,當n>=3時,每次都乘以矩陣b,就能推出下乙個矩陣。而矩陣的第一行第一列的元素就是所求的結果。
所以利用矩陣快速冪能夠快速準確地求出結果。
由以上就可以很快得出結果了:
const ll mod=1e6+7;
const int n=1e3+10;
ll x1,x2,aa,bb,cc,n;
struct mat
;mat mat_mul(mat x,mat y)
mat mat_fast_pow(mat x,ll k)
return res;
}void solve()
int main()
if(n==2)
solve();
}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 遞推求值(矩陣計算)
題目描述 給你乙個遞推公式 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可能很大。因此可以將遞推公式轉換成矩陣...
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 在濤神的協助下構造出來的矩陣 貌似發表了就格式亂了,空格用 表示 fn.b.a.1.fn 1 fn...