nyoj 301 遞推求值(經典矩陣運算)

2021-07-09 06:39:04 字數 1333 閱讀 1121

時間限制:

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,表示測試資料的組數(t<=10000)

隨後每行有六個整數,分別表示f(1),f(2),a,b,c,n的值。

其中0<=f(1),f(2)<100,-100<=a,b,c<=100,1<=n<=100000000 (10^9)

輸出輸出f(n)對1000007取模後的值

樣例輸入

2

1 1 1 1 0 5

1 1 -1 -10 -100 3

樣例輸出

5

#include#include#includeusing namespace std;

long long m,n,a,b,c,k;

long long mol=1000007;

long long x1,x2,x3;

long long y1,y2,y3;

long long z1,z2,z3;

void fun()

if(h==2)

long long r1=1,r2=0,r3=0;

long long s1=0,s2=1,s3=0;

long long t1=0,t2=0,t3=1;h-=2;

while(h>=1)

o1=(x1*x1+y1*x2+z1*x3)%mol;p1=(x1*y1+y1*y2+z1*y3)%mol;q1=(x1*z1+y1*z2+z1*z3)%mol;

o2=(x2*x1+y2*x2+z2*x3)%mol;p2=(x2*y1+y2*y2+z2*y3)%mol;q2=(x2*z1+y2*z2+z2*z3)%mol;

o3=(x3*x1+y3*x2+z3*x3)%mol;p3=(x3*y1+y3*y2+z3*y3)%mol;q3=(x3*z1+y3*z2+z3*z3)%mol;

x1=o1;x2=o2;x3=o3;y1=p1;y2=p2;y3=p3;z1=q1;z2=q2;z3=q3;

h/=2;

} n=(m*r2+n*s2+t2)%mol;

n=(n+mol)%mol;

printf ("%d\n",n);

}int main()

}

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可能很大。因此可以將遞推公式轉換成矩陣...