(矩阵快速幂, 数学公式推导)HDU 6050 Funny Function

来源:互联网 发布:善用佳软 知乎 编辑:程序博客网 时间:2024/05/22 10:49

HDU-2017 多校训练赛2-1006-Funny Function

题目网址: HDU 6050 Funny Function

题解(BestCoder提供):

  • 对于任意i>=1,当j>=3时,有

    这里写图片描述

  • 通过归纳法可以得到

这里写图片描述

  • 进而推导出

这里写图片描述

  • 通过矩阵快速幂求解

代码:

#include <iostream>#include <cstring>using namespace std;#define SIZE 2struct matrix{    long long e[SIZE][SIZE];    matrix()    {        memset(e, 0, sizeof(e));    }}A, A_n;const long long mod = 1e9+7;      //上限matrix operator*(matrix &a, matrix &b){    matrix t;    for (int i = 0; i < SIZE; ++i)    {        for (int j = 0; j < SIZE; ++j)        {            for (int k = 0; k < SIZE; ++k)            {                t.e[i][j] += a.e[i][k]*b.e[k][j];                t.e[i][j] %= mod;            }        }    }    return t;}matrix quickpower(matrix &a, long long b){    matrix ans;    for (int i = 0; i < SIZE; ++i)    {        ans.e[i][i] = 1;    }    while (b)    {        if (b & 1) ans = ans * a;        b >>= 1;        a = a * a;    }    return ans;}int main(int argc, char const *argv[]){    int testn;    scanf("%d", &testn);    while (testn--)    {        long long n, m;        scanf("%I64d %I64d", &n, &m);        A.e[0][0] = 0;        A.e[1][0] = A.e[1][1] = 1;        A.e[0][1] = 2;        A_n = quickpower(A, n);        matrix b;        if(n & 1)        {            b.e[0][0] = -1;            b.e[0][1] = 2;            b.e[1][0] = 1;            b.e[1][1] = 0;        }        else        {            b.e[0][0] = b.e[1][1] = 1;            b.e[0][1] = b.e[1][0] = 0;        }        A_n.e[0][0] -= b.e[0][0];        A_n.e[0][1] -= b.e[0][1];        A_n.e[1][0] -= b.e[1][0];        A_n.e[1][1] -= b.e[1][1];        A_n = quickpower(A_n, m-1);        long long ans = (A_n.e[0][0] + A_n.e[1][0]) % mod;        printf("%I64d\n", ans);    }    return 0;}