比赛 201712练习 评测结果 AAAAAAAAAA
题目名称 斐波那契平方和 最终得分 100
用户昵称 胡嘉兴 运行时间 0.003 s
代码语言 C++ 内存使用 0.31 MiB
提交时间 2017-12-23 08:03:04
显示代码纯文本
#include<bits/stdc++.h>
#define N 5
#define ll long long
using namespace std;
const ll p = 1e9+7;
struct martrix
{
    ll A[N][N];
    void init()
    {
        memset(A, 0, sizeof(A));
        A[1][2] = A[2][1] = A[2][2] = 1;
    }
    martrix operator * (martrix& a)const{
        martrix ans;
        memset(ans.A, 0, sizeof(ans.A));
        for(int i = 1; i < 3; i++)
        {
            int j = 1;
            for(int k = 1; k < 3; k++)
            {
                ans.A[i][j] += A[i][k]*a.A[k][j];
            }
            ans.A[i][j] %= p;
        }
        /*for(int i = 1; i <= 1; i++)
        {
            for(int j = 1; j <= 3; j++)
            {
                for(int k = 1; k <= 3; k++)
                {
                    ans.A[i][j] += A[i][k]*a.A[k][j];
                    ans.A[i][j] %= MOD;
                }
            }
        }*/
        return ans;
    }
    martrix ppow()const{
        martrix ans;
        memset(ans.A, 0, sizeof(ans.A));
        for(int i = 1; i < 3; i++)
        {
            for(int j = 1; j < 3; j++)
            {
                for(int k = 1; k < 3; k++)
                {
                    ans.A[i][j] += A[i][k]*A[k][j];
                }
                ans.A[i][j] %= p;
            }
        }
        return ans;
    }
};
martrix t, ans;
void qpow(ll k)
{
    t.init();
    memset(ans.A, 0, sizeof(ans.A));
    ans.A[2][1] = 1;
    while(k)
    {
        if(k&1)
        {
            ans = t*ans;
        }
        t = t.ppow();
        k >>= 1;
    }
    printf("%lld\n", ans.A[2][1]*ans.A[1][1]%p);
}
int main()
{
    freopen("fibsqr.in","r",stdin);
    freopen("fibsqr.out","w",stdout);
    ll n;
    scanf("%lld", &n);
    qpow(n);
}