记录编号 186541 评测结果 AAAAAAAAAA
题目名称 eins 最终得分 100
用户昵称 Gravatarmikumikumi 是否通过 通过
代码语言 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;
}