#include "cstdio"
#include "cstring"
#define LL long long
#define mod m
#define K 2
LL n,m;
struct Matrix
{
LL mat[K][K];
Matrix() {memset(mat,0,sizeof(mat));}
Matrix(LL *val)
{
int idx=0;
for(int i=0;i<K;i++)
for(int j=0;j<K;j++)
mat[i][j]=val[idx++];
}
};
Matrix operator * (Matrix a,Matrix b)
{
Matrix ret;
for(int i=0;i<K;i++)
for(int j=0;j<K;j++)
{
ret.mat[i][j]=0;
for(int k=0;k<K;k++)
ret.mat[i][j]+=((a.mat[i][k]*b.mat[k][j])%mod);
}
return ret;
}
Matrix operator ^ (Matrix a,LL n)
{
Matrix ret,base=a;
for(int i=0;i<K;i++) ret.mat[i][i]=1;
while(n)
{
if(n&1) ret=ret*base;
base=base*base;
n>>=1;
}
return ret;
}
int main()
{
//freopen("in.txt","r",stdin);
int T;
scanf("%d",&T);
while(T--)
{
scanf("%I64d%I64d",&n,&m);
if(n==0) printf("0\n");
else
{
LL obj=n*2;
LL bval[]={1,0,0,0};
LL pval[]={1,1,1,0};
Matrix Base(bval),Pow(pval),ans=Pow^(obj-1);
ans=Base*ans;
printf("%I64d\n",ans.mat[0][0]%mod);
}
}
}
tjut 2855
最新推荐文章于 2016-08-31 17:14:15 发布