源代码: #include<cstdio> int n; void x1(int x,int y) { x-=2; //利用规律:[F(n),F(n-1)]=[F(n-1),F(n-2)]*[1,1/1,0]。 int t1=1,t2=0,t3=0,t4=1; //在矩阵乘法中,[1,1/1,1]的作用并不等于1的作用。 int x1=1,x2=1,x3=1,x4=0; while (x) { if (x%2) { int y1=t1,y2=t2,y3=t3,y4=t4; t1=((y1*x1)%y+(y2*x3)%y)%y; t2=((y1*x2)%y+(y2*x4)%y)%y; t3=((y3*x1)%y+(y4*x3)%y)%y; t4=((y3*x2)%y+(y4*x4)%y)%y; } x/=2; int y1=x1,y2=x2,y3=x3,y4=x4; x1=((y1*y1)%y+(y2*y3)%y)%y; x2=((y1*y2)%y+(y2*y4)%y)%y; x3=((y3*y1)%y+(y4*y3)%y)%y; x4=((y3*y2)%y+(y4*y4)%y)%y; } //矩阵快速幂。 printf("%d ",(t1+t3)%y); } int main() { scanf("%d",&n); for (int a=1;a<=n;a++) { int x,y; scanf("%d%d",&x,&y); x1(x+1,y); //注意,此Fibonacci数列从0开始。 } return 0; }