6198 number number number

来源:互联网 发布:如何恢复ipad数据 编辑:程序博客网 时间:2024/06/06 19:16

题意:

找到K个数字不能构成的fibonacci数字的最小值。

思路:

对于2个数字来说,他所不能构成的最小值,必定是从第 s 个 到第s -1个的fibonacci数字差值大于  一个数字能组成的fibonacci数字。

找个规律发现是 4+n*2-1个数字-1

#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <iostream>using namespace std;struct matrix{    long long arr[3][3];};long long mod=998244353;matrix base,ans;matrix matrix_mulip(matrix a,matrix b){    matrix tep;    for(int i=1;i<=2;i++)    {        for(int j=1;j<=2;j++)        {            tep.arr[i][j]=0;            for(int k=1;k<=2;k++)            {                tep.arr[i][j]=(tep.arr[i][j]+a.arr[i][k]*b.arr[k][j])%998244353;            }        }    }    return tep;}void matrix_pow(matrix a,long long n){    while(n)    {        if(n%2)        {            ans=matrix_mulip(ans,a);        }        a=matrix_mulip(a,a);        n=n/2;    }}int main(){    base.arr[1][1]=base.arr[1][2]=base.arr[2][1]=1;    base.arr[2][2]=0;    long long  n;    while(~scanf("%lld",&n) )    {        ans.arr[1][1]=ans.arr[2][2]=1;        ans.arr[1][2]=ans.arr[2][1]=0;        matrix_pow(base,(4+n*2-1));        printf("%lld\n",ans.arr[1][2]%998244353-1);    }    return 0;}