Recursive sequence
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 1705 Accepted Submission(s): 775
Each case contains only one line with three numbers N, a and b where N,a,b < 231 as described above.
#include <bits/stdc++.h>
using namespace std;
const long long N = 7, Mod = 2147493647;
int t;
long long f1, f2, n;
struct xx{
long long a[N][N];
} ori,res;
xx mul(xx x,xx y){
xx temp;
memset(temp.a, 0, sizeof(temp.a));
for(int i = 0; i < N; i++){
for(int j = 0; j < N; j++){
for(int k = 0; k < N; k++){
temp.a[i][j] += x.a[i][k]*y.a[k][j];
temp.a[i][j] %= Mod;
}
}
}
return temp;
}
void init(){
memset(res.a, 0, sizeof(res.a));
memset(ori.a, 0, sizeof(ori.a));
ori.a[0][0] = 1, ori.a[1][0] = 2, ori.a[2][0] = 1;
ori.a[0][1] = 1, ori.a[2][2] = 1, ori.a[3][2] = 4;
ori.a[4][2] = 6, ori.a[5][2] = 4, ori.a[6][2] = 1;
ori.a[3][3] = 1, ori.a[4][3] = 3, ori.a[5][3] = 3;
ori.a[6][3] = 1, ori.a[4][4] = 1, ori.a[5][4] = 2;
ori.a[6][4] = 1, ori.a[5][5] = 1, ori.a[6][5] = 1, ori.a[6][6] = 1;
res.a[0][0] = f2, res.a[0][1] = f1, res.a[0][2] = 81;
res.a[0][3] = 27, res.a[0][4] = 9, res.a[0][5] = 3, res.a[0][6] = 1;
}
long long calc(long long k){
while(k){
if(k & 1) res = mul(res, ori);
ori = mul(ori, ori);
k >>= 1;
}
return res.a[0][0];
}
int main(){
scanf("%d", &t);
while(t--){
scanf("%lld%lld%lld", &n, &f1, &f2);
if(n == 1){
printf("%lld\n", f1);
continue;
}
if(n == 2){
printf("%lld\n", f2);
continue;
}
init();
printf("%lld\n", calc(n-2));
}
}