AcWing 1304 佳佳的斐波那契

2022-10-11 16:51:10 字數 1399 閱讀 9311

題目傳送門

\[\because s_n=f_1+f_2+⋯+f_n=\sum_^f_i \\

t_n=f_1+2*f_2+...+nf_n=\sum_^if_i\]

我們需要利用\(t_n\)構造新的數列,從而消去變數\(i\),最後再反解出\(t_n\):

\[\therefore ns_n-t_n=(n-1)f_1+(n-2)f_2+...+f_

\]令\(c_n=ns_n-t_n\)

\[\therefore c_n=(n-1)f_1+(n-2)f_2+...+f_

\]\[c_=nf_1+(n-1)f_2+...+f_

\]下式減上式

\[c_-c_n=f_1+f_2+f_3+...+f_n=s_n

\]於是我們只需維護如下矩陣即可

\[\begin

f_ & f_n & s_n & c_n

\end

\]有如下等式:

\[\begin

f_ & f_n & s_n & c_n

\end \times

\begin

1 & 1 & 1 & 0 \\

1 & 0 & 0 & 0 \\

0 & 0 & 1 & 1 \\

0 & 0 & 0 & 1

\end=

\begin

f_ & f_ & s_ & c_

\end

\]然後直接使用矩陣快速冪便可以求解

後來的\(t_n=ns_n-c_n\)

#include using namespace std;

typedef long long ll;

const int n = 4;

int n, mod;

//矩陣乘法

void mul(ll a[n], ll b[n], ll c[n]) ;

for (ll i = 0; i < n; i++)

memcpy(c, t, sizeof t);

}//矩陣快速冪

// a: 初始矩陣,同時也是結果矩陣

// b: 構建的向量矩陣,需要它進行多個冪次方計算

// k: 多少次方

void qmi(ll a[n], ll b[n], int k)

}int main() ;

ll b[n][n] = ,,,

};cin >> n >> mod;

qmi(a, b, n);

ll t = (n * a[0][2]) - a[0][3];

t = (t % mod + mod) % mod;

printf("%lld\n", t);

return 0;

}

題解 佳佳的斐波那契數列 矩陣

求 sigma i times fib i 的值 n le2 1 看資料範圍就會做的題.設 f n ib n g n nf n s n sigma g n 然後 f i f i 1 f i 2 s i s i 1 g i 不好求 g 但是可以直接這樣 g i i times f i i times ...

ACWing 21 斐波那契數列(Python版)

輸入乙個整數 n 求斐波那契數列的第 n 項。假定從0開始,第0項為0。n 39 樣例輸入整數 n 5 返回 5 f n f n 1 f n 2 n 2 若採用直接遞迴,則會超出執行時間。優化方法 記住已有的結果 快取 來優化程式效能。class solution object def init s...

斐波那契前 n 項和acwing

大家都知道 fibonacci 數列吧,f1 1,f2 1,f3 2,f4 3,fn fn 1 fn 2。現在問題很簡單,輸入 n 和 m,求 fn 的前 n 項和 snmodm。輸入格式 共一行,包含兩個整數 n 和 m。輸出格式 輸出前 n 項和 snmodm 的值。資料範圍 1 n 20000...