NYOJ301 遞推求值

2021-07-24 10:12:00 字數 1087 閱讀 6523

遞推求值

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...