您的位置:首页 > 其它

hdu 6198(找规律、矩阵快速幂)

2018-01-24 12:02 295 查看
/*

    hdu 6198

    题目大意就是

    给你一个数k

    问你用k个斐波拉契数不能组成的最小的数是几

    比如 当k==1时

    不能组成斐波拉契数就是4

    因为 0 1 1 2 3 5 8 13 21 34

    然后我们多列几项找规律

    k==2时 答案为12

    k==3时 答案为33

    我们找到规律

    答案为 f(2*k+3)-1

    然后我们就用矩阵求出对应的斐波拉契数即可

*/

#include <iostream>

#include <stdio.h>

#include <algorithm>

#include <math.h>

#include <string.h>

#define PI acos(-1.0)

#define ll long long

#define mod 998244353

using namespace std;

struct matrix

{

    ll m[3][3];

};

matrix matrixmul(matrix a,matrix b)

{

    matrix c;

    for(int i=1; i<=2; i++)

        for(int j=1; j<=2; j++)

        {

            c.m[i][j]=0;

            for(int k=1; k<=2; k++)

                c.m[i][j]+=(a.m[i][k]*b.m[k][j])%mod;

            c.m[i][j]%=mod;

        }

    return c;

}

matrix quickpow(matrix m,int n)

{

    matrix b;

    memset(b.m,0,sizeof(b.m));

    for(int i = 1; i <= 2; i++)

        b.m[i][i] = 1;

    while(n>=1)

    {

        if(n&1)

            b=matrixmul(b,m);

        n=n>>1;

        m=matrixmul(m,m);

    }

    return b;

}

int main()

{

    cout<<"\n";

    int k;

    cin>>k;

    matrix m;

    m.m[1][1]=1;m.m[1][2]=1;

    m.m[2][1]=1;m.m[2][2]=0;

    matrix res=quickpow(m,2*k+3);

    cout<<res.m[1][2]-1<<endl;

    return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: