HDU

来源:互联网 发布:菜鸟商城android源码 编辑:程序博客网 时间:2024/06/14 08:27

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6198

题目大意:k个非减斐波那契数相加,问不出现在构造的数中最小的数

解题思路:打表找规律,发现求得数为F[2*k+3]-1,而求斐波那契数可以用矩阵快速幂求解

打表代码:

#include<cstdio>#include<algorithm>#include<set>using namespace std;typedef long long LL;const int MAXN = 100000;const int MOD = 998244353;int fib[MAXN],tmp[MAXN],n=40;set<int> ans;void getFib(){    fib[0] = 0, fib[1] = 1;    for (int i = 2;i < n;++i)        fib[i] = fib[i - 1] + fib[i - 2];}int main(){    getFib();    for (int i = 0;i < n;++i)    {        ans.insert(fib[i]);        printf("%d ", fib[i]);    }    puts("");    for (int i = 1;i <= 4;++i)//速度比较慢,看到有用dp的,没看懂- =    {        int tot = 0;        for (set<int>::iterator it = ans.begin();it != ans.end();it++)            tmp[tot++] = *it;        for (int j = 0;j < n;++j)            for (int k = 0;k < tot;k++)                ans.insert(fib[j] + tmp[k]);        int p = 0;        for (set<int>::iterator it = ans.begin();it != ans.end();it++)        {            if (p != *it)            {                printf("%d\n", p);                break;            }            p++;        }    }    return 0;}

AC代码:

#include<cstdio>#include<iostream>using namespace std;typedef long long LL;const int Max = 10;const int Mod = 998244353;struct Matrix{    int _bulk;    LL _matrix[Max][Max];    Matrix(int bulk) :_bulk(bulk)    {        for (int i = 1;i <= _bulk;++i)            for (int j = 1;j <= _bulk;++j)                _matrix[i][j] = 0;    }    Matrix operator*(const Matrix& matrix)    {        Matrix result(_bulk);        for (int i = 1;i <= _bulk;++i)            for (int k = 1;k <= _bulk;++k)            {                if (!_matrix[i][k]) continue;                for (int j = 1;j <= _bulk;++j)                {                    result._matrix[i][j] += _matrix[i][k] * matrix._matrix[k][j] % Mod;                    result._matrix[i][j] %= Mod;                }            }        return result;    }    void Init()    {        for (int i = 1;i <= _bulk;++i)            _matrix[i][i] = 1;    }    Matrix quickpow(int n)    {        Matrix ans(_bulk);ans.Init();        Matrix tmp = (*this);        while (n)        {            if (n & 1) ans = ans*tmp;            tmp = tmp*tmp;            n >>= 1;        }        return ans;    }};int main(){    for (int k;scanf("%d", &k) == 1;)    {        Matrix matrix(2);        matrix._matrix[1][1] = 1;        matrix._matrix[1][2] = 1;        matrix._matrix[2][1] = 1;        matrix = matrix.quickpow(2 * k + 3 - 1);        printf("%I64d\n", (matrix._matrix[1][1] - 1 + Mod) % Mod);    }    return 0;}
原创粉丝点击