number number number
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 274 Accepted Submission(s): 174
⋅ F0=0,F1=1;
⋅ Fn=Fn−1+Fn−2 (n≥2).
Give you an integer k, if a positive number n can be expressed by
n=Fa1+Fa2+...+Fak where 0≤a1≤a2≤⋯≤ak, this positive number is mjf−good. Otherwise, this positive number is mjf−bad.
Now, give you an integer k, you task is to find the minimal positive mjf−bad number.
The answer may be too large. Please print the answer modulo 998244353.
Each test case includes an integer k which is described above. (1≤k≤109)
#include <bits/stdc++.h>
using namespace std;
const long long N = 2, Mod = 998244353;
long long m, n;
struct xx{
long long a[N][N];
} ori,res;
xx mul(xx x,xx y){
xx temp;
memset(temp.a, 0, sizeof(temp.a));
for(int i = 0; i < N; i++){
for(int j = 0; j < N; j++){
for(int k = 0; k < N; k++){
temp.a[i][j] += x.a[i][k]*y.a[k][j];
temp.a[i][j] %= Mod;
}
}
}
return temp;
}
void init(){
ori.a[0][0] = 1, ori.a[0][1] = 1;
ori.a[1][0] = 1, ori.a[1][1] = 0;
res.a[0][0] = 1, res.a[0][1] = 0;
res.a[1][0] = 0, res.a[1][1] = 1;
}
long long calc(long long k){
while(k){
if(k & 1) res = mul(res, ori);
ori = mul(ori, ori);
k >>= 1;
}
return res.a[0][0];
}
int main(){
while(scanf("%lld", &m) == 1){
init();
n = 4+(m-1)*2;
printf("%lld\n", calc(n)-1);
}
}