版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
题目所求为:
我们可以得到:
那么只要得到与之间的线性递推关系,就可以用矩阵快速幂了。
很明显
那么我们可以得到:
这样我们就可以用矩阵快速幂求解了。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll p, q, a1, a2, n, m;
struct matrix {
ll a[4][4];
matrix() {
memset(a, 0, sizeof(a));
}
matrix operator * (const matrix& b) {
matrix res;
for(int i = 1; i <= 3; i++) {
for(int j = 1; j <= 3; j++) {
for(int k = 1; k <= 3; k++) {
res.a[i][j] = (res.a[i][j] + a[i][k] * b.a[k][j]) % m;
}
}
}
return res;
}
};
ll power(ll n)
{
matrix ans, base;
for(int i = 1; i <= 3; i++) {
for(int j = 1; j <= 3; j++) {
ans.a[i][j] = 0;
base.a[i][j] = 0;
}
}
ans.a[1][1] = p * a2 + q * a1;
ans.a[1][2] = a2, ans.a[1][3] = a1;
base.a[1][1] = p, base.a[1][2] = 1;
base.a[2][1] = q, base.a[2][3] = 1;
while(n) {
if(n & 1) ans = ans * base;
base = base * base;
n >>= 1;
}
return ans.a[1][1] % m;
}
int main()
{
while(scanf("%lld %lld %lld %lld %lld %lld", &p, &q, &a1, &a2, &n, &m) == 6) {
if(n == 1) printf("%lld\n", a1 % m);
else if(n == 2) printf("%lld\n", a2 % m);
else if(n == 3) printf("%lld\n", ((p % m * a2 % m) % m + (q % m * a1 % m) % m) % m );
else printf("%lld\n", power(n - 3) % m);
}
return 0;
}