题解:P12847 [蓝桥杯 2025 国 A] 斐波那契数列
InterRiver · · 题解
在赛场上,注意到了一个事情:
因此在求
最后,sum_f 矩阵
#include<bits/stdc++.h>
using namespace std;
typedef long long i64;
const i64 mod = 998244353;
const i64 mod1 = mod - 1;
struct Matrix {
i64 v[3][3];
void clear() {
memset(v, 0, sizeof(v));
}
};
Matrix operator * (const Matrix &A, const Matrix &B) {
Matrix ret; ret.clear();
for(int i = 0; i < 3; i++)
for(int j = 0; j < 3; j++)
for(int k = 0; k < 3; k++)
ret.v[i][j] = (ret.v[i][j] + A.v[i][k] * B.v[k][j]) % mod1;
return ret;
}
Matrix sum_f(i64 n) {
Matrix x, r;
x.clear(); r.clear();
x.v[0][1] = 1;
x.v[1][0] = x.v[1][1] = 1;
x.v[2][0] = x.v[2][2] = 1;
r.v[0][0] = r.v[1][1] = r.v[2][2] = 1;
while(n) {
if(n & 1) r = r * x;
x = x * x; n /= 2;
}
return r;
}
i64 qpow(i64 x, i64 p) {
i64 r = 1;
while(p) {
if(p & 1) r = r * x % mod;
x = x * x % mod; p /= 2;
}
return r;
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
i64 n; cin >> n;
Matrix m = sum_f(n);
i64 p2 = m.v[2][0];
i64 p3 = m.v[2][1];
i64 ans = qpow(2, p2) * qpow(3, p3) % mod;
cout << ans << endl;
return 0;
}
不过还有一个问题:循环节长度