题意:
已知 ,给n,mod, X0, X1, a, b求 Xn,
题解
因为n太大,所以采用 十进制矩阵快速幂
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int mod = 0;
char s[1000005];
struct Matrix{
ll a[2][2];
};
Matrix mul(Matrix A, Matrix B){
Matrix C;
C.a[0][0] = (A.a[0][0] * B.a[0][0] + A.a[0][1] * B.a[1][0]) % mod;
C.a[0][1] = (A.a[0][0] * B.a[0][1] + A.a[0][1] * B.a[1][1]) % mod;
C.a[1][0] = (A.a[1][0] * B.a[0][0] + A.a[1][1] * B.a[1][0]) % mod;
C.a[1][1] = (A.a[1][0] * B.a[0][1] + A.a[1][1] * B.a[1][1]) % mod;
return C;
}
Matrix pow_mod(Matrix A, char c[]){
Matrix B;
for(int i = 0; i < 2; i++){
for(int j = 0; j < 2; j++){
B.a[i][j] = i == j ? 1 : 0;
}
}
int len = strlen(c);
for(int i = len-1; i >= 0; i--){
int p = c[i] - '0';
Matrix temp = A;
for(int j = 1; j <= p; j++){
B = mul(B, A);
}
for(int j = 1; j < 10; j++){
A = mul(A, temp);
}
}
return B;
}
int main(){
int x0, x1, a, b;
scanf("%d%d%d%d", &x0, &x1, &a, &b);
scanf("%s", s);
scanf("%d", &mod);
Matrix A, B;
memset(A.a, 0, sizeof(A.a));
memset(B.a, 0, sizeof(B.a));
A.a[0][0] = a; A.a[0][1] = b;
A.a[1][0] = 1; A.a[1][1] = 0;
A = pow_mod(A, s);
B.a[0][0] = x1;
B.a[1][0] = x0;
B = mul(A, B);
printf("%lld\n", B.a[1][0]);
return 0;
}