考点:矩阵快速幂,确定矩阵递推公式
#include <iostream>
#include <cstring>
using namespace std;
typedef long long LL;
LL n, mod = 99999999;
LL a[7][7] = { {0, 1, 0, 0, 2, 0, 5},
{1, 0, 0, 0, 3, 2, 3},
{1, 0, 0, 0, 0, 0, 0},
{0, 1, 0, 0, 0, 0, 0},
{0, 0, 1, 0, 0, 0, 0},
{0, 0, 0, 1, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 1}
};
LL b[7][1] = { {6},
{5},
{1},
{4},
{2},
{3},
{1}
};
LL c[7][7];
LL res[7][1];
LL ans[7][7] ={ {1, 0, 0, 0, 0, 0, 0},
{0, 1, 0, 0, 0, 0, 0},
{0, 0, 1, 0, 0, 0, 0},
{0, 0, 0, 1, 0, 0, 0},
{0, 0, 0, 0, 1, 0, 0},
{0, 0, 0, 0, 0, 1, 0},
{0, 0, 0, 0, 0, 0, 1}
};
//求矩阵ans与a的和,结果保存在ans中
void mul(){
memset(c, 0, sizeof(c));
for(int k = 0; k < 7; k++){
for(int i = 0; i < 7; i++){
for(int j = 0; j < 7; j++){
c[i][j] = (c[i][j] + ans[i][k] * a[k][j]) % mod;
}
}
}
memcpy(ans, c, sizeof(c));
}
//求矩阵a * a
void mul_a(){
memset(c, 0, sizeof(c));
for(int k = 0; k < 7; k++){
for(int i = 0; i < 7; i++){
for(int j = 0; j < 7; j++){
c[i][j] = (c[i][j] + a[i][k] * a[k][j]) % mod;
}
}
}
memcpy(a, c, sizeof(c));
}
//求矩阵ans * b
void mul_ab(){
memset(res, 0, sizeof(res));
for(int k = 0; k < 7; k++){
for(int i = 0; i < 7; i++){
for(int j = 0; j < 1; j++){
res[i][j] = (res[i][j] + ans[i][k] * b[k][j]) % mod;
}
}
}
}
//求矩阵a的k次方
void qp(LL k){
while(k){
if(k & 1) mul(); //ans *= a
mul_a();
k >>= 1;
}
}
int main(){
scanf("%I64d", &n);
if(n <= 3){
if(n == 1) printf("2\n3\n");
else if(n == 2) printf("1\n4\n");
else printf("6\n5\n");
}
else{
qp(n - 3);
mul_ab();
printf("%I64d\n%I64d\n", res[0][0], res[0][1]);
}
return 0;
}