題目傳送門
\[\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...