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