#include<iostream>
typedef long long ll;
using namespace std;
const int mod = 998244353;
struct mat {
ll a[4];
void init() {
a[0] = a[3] = 1;
a[1] = a[2] = 0;
}
mat mul(const mat &x) {
mat res;
res.a[0] = (a[0] * x.a[0] % mod + a[1] * x.a[2] % mod) % mod;
res.a[1] = (a[0] * x.a[1] % mod + a[1] * x.a[3] % mod) % mod;
res.a[2] = (a[2] * x.a[0] % mod + a[3] * x.a[2] % mod) % mod;
res.a[3] = (a[2] * x.a[1] % mod + a[3] * x.a[3] % mod) % mod;
return res;
}
};
mat pow(mat a, ll b) {
mat res;
res.init();
while(b) {
if(b & 1) res = res.mul(a);
a = a.mul(a);
b >>= 1;
}
return res;
}
ll fb(ll n) {
if(n == 0) return 1;
if(n < 4) return n;
mat t;
t.a[0] = 0; t.a[1] = 1; t.a[2] = 1; t.a[3] = 1;
t = pow(t, n);
return t.a[3];
}
ll n;
void solve() {
while(cin >> n) {
cout <<fb(n)<< endl;
}
}
int main() {
solve();
return 0;
}
斐波那契数列模板
最新推荐文章于 2024-03-16 14:39:04 发布