题意介绍
Q老师 对数列有一种非同一般的热爱,尤其是优美的斐波那契数列。
这一天,Q老师 为了增强大家对于斐波那契数列的理解,决定在斐波那契的基础上创建一个新的数列 f(x) 来考一考大家。数列 f(x) 定义如下:
当 x < 10 时,f(x) = x;
当 x ≥ 10 时,f(x) = a0 * f(x-1) + a1 * f(x-2) + a2 * f(x-3) + …… + a9 * f(x-10),ai 只能为 0 或 1。
Q老师 将给定 a0~a9,以及两个正整数 k m,询问 f(k) % m 的数值大小。
聪明的你能通过 Q老师 的考验吗?
题意分析
矩阵快速幂,递推关系式为:
只要构造出方阵即可。
通过代码
#include<bits/stdc++.h>
using namespace std;
const int N = 10;
int k, m;
struct Matrix {
int x[N][N];
Matrix operator*(const Matrix& t)const {
Matrix ret;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
ret.x[i][j] = 0;
for (int k = 0; k < N; k++) {
ret.x[i][j] += (x[i][k] * t.x[k][j])%m;
ret.x[i][j] %= m;
}
}
}
return ret;
}
Matrix() { memset(x, 0, sizeof(x)); }
Matrix(const Matrix& t) {
memcpy(x, t.x, sizeof(x));
}
};
Matrix quick_pow(Matrix a, int x) {
Matrix ret;
for (int i = 0; i < N; i++) ret.x[i][i] = 1;
while (x) {
if (x & 1) ret = ret * a;
a = a * a;
x >>= 1;
}
return ret;
}
int main() {
while (cin >> k >> m) {
if (k <= 9) cout << k % m;
else {
Matrix temp;
for (int i = 0; i < N; i++)
cin >> temp.x[0][i];
for (int i = 1; i < N; i++)
temp.x[i][i - 1] = 1;
temp = quick_pow(temp, k - 9);
int ans = 0;
for (int i = 0; i < 10; i++) {
ans += (temp.x[0][i] * (9 - i)) % m;
ans %= m;
}
cout << ans << endl;
}
}
return 0;
}