比赛 |
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]);
}
}