#include <iostream>
#include <cstdio>
#include <string.h>
#include <algorithm>
#include <map>
#include <queue>
#include <stdlib.h>
#include <cmath>
#include <vector>
#include <stack>
#define clr(x) memset(x,0,sizeof(x))
#define clr2(x) memset(x,INF,sizeof(x))
#define clr3(x) memset(x,-INF,sizeof(x))
#define INF 0x3f3f3f3f
#define MAXN 100010
#define MAXM 100010
#define pb(x) push_back(x)
#define ll long long
#define ull unsigned long long
#define MAXS 100000010
using namespace std;
struct Martix
{
ll a[3][3];
};
ll p;
ll mul2(ll y, ll cnt);
Martix mul(Martix a,Martix b) //¾ØÕó3Ë·¨
{
Martix c;
clr(c.a);
for (int i=0;i<3;i++)
for (int j=0;j<3;j++)
for (int k=0;k<3;k++)
{
c.a[i][j] += ( a.a[i][k]*b.a[k][j] ) % p;
c.a[i][j] %= p;
}
return c;
}
Martix solve_pow(Martix a,ll t) //¿ìËùÃY
{
Martix b;
clr(b.a);
for(int i=0;i<3;i++)
b.a[i][i]=1;
while(t>0)
{
if(t & 1) b=mul(b,a);
a=mul(a,a);
t >>= 1;
}
return b;
}
int euler(int n){
int res=n,a=n;
for(int i=2;i*i<=a;i++){
if(a%i==0){
res=res/i*(i-1);
while(a%i==0) a/=i;
}
}
if(a>1) res=res/a*(a-1);
return res;
}
ll quickmod(ll a,ll b,ll m)
{
ll ans = 1;
while(b)
{
if(b&1)
{
ans = (ans*a)%m;
b--;
}
b/=2;
a = a*a%m;
}
return ans;
}
ll n,y,x,s;
void solve()
{
scanf("%lld%lld%lld%lld",&n,&y,&x,&s);
Martix base,ans;
base.a[0][0]=5;
base.a[0][1]=1;
base.a[0][2]=0;
base.a[1][0]=5;
base.a[1][1]=0;
base.a[1][2]=1;
base.a[2][0]=-1;
base.a[2][1]=0;
base.a[2][2]=0;
p=euler(s+1);
ans=solve_pow(base,n*y-1);
ll ex=ans.a[0][0];
ex+=p;
ll res=quickmod(x,ex,s+1);
printf("%lld\n",res);
}
int main()
{
int T;
scanf("%d",&T);
while (T--)
solve();
return 0;
}
hdu 5895
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.