题目描述
广义的斐波那契数列是指形如 a_n=p\times a_{n-1}+q\times a_{n-2}an=p×an−1+q×an−2 的数列。
今给定数列的两系数 pp 和 qq,以及数列的最前两项 a_1a1 和a_2a2,另给出两个整数 nn 和 mm,试求数列的第 nn 项 a_n \bmod manmodm。
输入格式
输入包含一行六个整数,p,q,a_1,a_2,n,mp,q,a1,a2,n,m。
输出格式
输出包含一行一个整数表示答案。
输入输出样例
输入 #1复制
1 1 1 1 10 7
输出 #1复制
6
说明/提示
数列第 1010项是 5555,55 \bmod 7 = 655mod7=6。
【数据范围】
对于 100\%100% 的数据,p,q,a_1,a_2 \in [0,2^{31}-1]p,q,a1,a2∈[0,231−1],1\le n,m \le 2^{31}-11≤n,m≤231−1。
上代码:
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
typedef long long LL;
LL n, Mod, p, q, a1, a2, ans;
struct mat{
LL m[4][4];
}Ans, base;
inline void init() {
Ans.m[1][1] = a2, Ans.m[1][2] = a1;
base.m[1][1] = p, base.m[2][1] = q, base.m[1][2] = 1;
}
inline mat mul(mat a, mat b) {
mat res;
memset(res.m, 0, sizeof(res.m));
for(int i=1; i<=2; i++) {
for(int j=1; j<=2; j++) {
for(int k=1; k<=2; k++) {
res.m[i][j] += (a.m[i][k] % Mod) * (b.m[k][j] % Mod);
res.m[i][j] %= Mod;
}
}
}
return res;
}
inline void Qmat_pow(int p) {
while (p) {
if(p & 1) Ans = mul(Ans, base);
base = mul(base, base);
p >>= 1;
}
}
int main() {
scanf("%lld%lld%lld%lld%lld%lld", &p, &q, &a1, &a2, &n, &Mod);
if(n == 1) {
cout<<a1;
return 0;
}
if(n == 2) {
cout<<a2;
return 0;
}
init();
Qmat_pow(n-2);
ans = Ans.m[1][1];
ans %= Mod;
printf("%lld", ans);
}