记录编号 |
186541 |
评测结果 |
AAAAAAAAAA |
题目名称 |
eins |
最终得分 |
100 |
用户昵称 |
mikumikumi |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
2.888 s |
提交时间 |
2015-09-13 09:48:46 |
内存使用 |
0.32 MiB |
显示代码纯文本
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long LL;
int t;
LL n,p;
class miku//矩阵
{
public:
int n,m;
LL s[2][2];
miku()
{
memset(s,0,sizeof(s));
n=m=0;
}
void make(int a)
{
n=m=a;
for(int i=0;i<n;i++)
s[i][i]=1;
}
void print()
{
cout<<n<<" "<<m<<endl;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
cout<<s[i][j]<<" ";
cout<<endl;
}
cout<<endl;
}
};
inline miku operator * (miku a,miku b)
{
miku c;
c.n=a.n;c.m=b.m;
for(int i=0;i<a.n;i++)
for(int j=0;j<b.m;j++)
{
for(int k=0;k<a.m;k++)
{
c.s[i][j]+=a.s[i][k]*b.s[k][j];
c.s[i][j]%=p;
}
}
return c;
}
miku re;
miku quickpow(miku S,int t)
{
re.make(1);
while(t>0)
{
if(t&1) re=re*S;
S=S*S;t>>=1;
}
return re;
}
miku S;
LL work()
{
if(n==0) return 0;
miku ans=quickpow(S,n-1);
//ans.print();
return ans.s[0][0];
}
int main()
{
freopen("eins.in","r",stdin);
freopen("eins.out","w",stdout);
scanf("%d",&t);
for(int i=1;i<=t;i++)
{
scanf("%lld%lld",&n,&p);
//cout<<n<<" "<<p<<endl;
S.n=S.m=2;
S.s[0][0]=1,S.s[0][1]=1;
S.s[1][0]=1,S.s[1][1]=0;
printf("%lld\n",work()%p);
}
return 0;
}