比赛 201712练习 评测结果 AAAAAAAAAA
题目名称 数学序列 最终得分 100
用户昵称 胡嘉兴 运行时间 0.004 s
代码语言 C++ 内存使用 0.31 MiB
提交时间 2017-12-26 16:23:13
显示代码纯文本
#include<bits/stdc++.h>
#define N 5
#define ll long long
using namespace std;
const int p = 7;
struct martrix
{
    ll A[N][N];
    void init(int a, int b)
    {
        memset(A, 0, sizeof(A));
        A[1][2] = 1;
        A[2][1] = b;
        A[2][2] = a;
        return;
    }
    martrix operator * (martrix& a)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.A[k][j];
                }
                ans.A[i][j] %= p;
            }

        }
        return ans;
    }
};
martrix t, ans;
int a, b, n;
void qpow(ll k)
{
    t.init(a, b);
    memset(ans.A, 0, sizeof(ans.A));
    ans.A[1][1] = ans.A[2][1] = 1;
    while(k)
    {
        if(k&1)
        {
            ans = t*ans;
        }
        t = t*t;
        k >>= 1;
    }
    return;
}
int main()
{

    freopen("number1.in","r",stdin);
	freopen("number1.out","w",stdout);
    while(scanf("%d%d%d", &a, &b, &n)!=EOF)
    {
        a %= p;
        b %= p;
        if(n<3)
        {
            puts("1");
            continue;
        }
        qpow(n-2);
        printf("%d\n", ans.A[2][1]);
    }
}