f(n)一定是a的幂,设指数为t(n)。则t(n) = b + c * t(n-1) + t(n-2),n很大,利用矩阵优化。
code:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <unordered_map>
using namespace std;
#define FOR(i, n, m) for(int i = n; i <= m; i++)
#define REP(i, n, m) for(int i = n; i >= m; i--)
#define PB push_back
#define MP make_pair
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> PII;
const int N = 3;
int mod;
struct Mat{
ll mat[N][N];
void init(){
memset(mat,0,sizeof(mat));
}
void setE(){
init();
for(int i = 0 ; i < N ; i ++)
mat[i][i] = 1;
}
Mat operator * (const Mat &a)const{
Mat ret;
ret.init();
for(int i = 0 ; i < N ; i ++)
for(int j = 0 ; j < N ; j ++)
for(int k = 0 ; k < N ; k ++)
ret.mat[i][k] = (ret.mat[i][k] + 1ll * mat[i][j] * a.mat[j][k] % mod) % mod;
return ret;
}
void output(){
for(int i = 0 ; i < N ; i ++){
for(int j = 0 ; j < N ; j ++)
printf("%d ",mat[i][j]);
printf("\n");
}
}
}A,B;
Mat operator ^ (Mat a,ll b){
Mat ret;
ret.setE();
while(b){
if(b & 1) ret = ret * a;
a = a * a;
b >>= 1;
}
return ret;
}
ll fastmod(ll a,ll b){
ll res = 1;
while(b){
if(b & 1) res = 1ll * res * a % mod;
a = 1ll * a * a % mod;
b >>= 1;
}
return res;
}
void Mat_init(ll c){
B.init();
B.mat[0][0] = c;B.mat[0][1] = 1;
B.mat[1][0] = 1;
B.mat[2][0] = 1;B.mat[2][2] = 1;
}
void solve(){
ll n, a,b,c;
cin >> n >> a >> b >> c >> mod;
if(n == 1){
printf("1\n");
return;
}
if (a % mod == 0) {
cout<< 0 << endl;
return;
}
mod --;
Mat_init(c);
A.init();
A.mat[0][0] = b;A.mat[0][1] = 0;A.mat[0][2] = b;
A = A * (B ^ (n - 2));
mod ++;
cout<<(fastmod(a,A.mat[0][0]))<<endl;
}
int main(){
int _;
scanf("%d",&_);
while(_--) solve();
return 0;
}