hdu 2855
题解:
知识储备:1.(1+x)^n=
2.斐波那契数列可以用矩阵来表示:mat={1,1,1,0},| 1 1|对应 | f(x+2) f(x+1)|
x可以换为mat,而1就是单位矩阵; | 1 0| | f(x+1) f(x) |
#include<stdio.h> int n,ma; struct Matrix { int m[2][2]; }; Matrix mat,unit; void Initiate() { mat.m[0][0]=2;//(1+x)的矩阵运算 mat.m[0][1]=1; mat.m[1][0]=1; mat.m[1][1]=1; unit.m[0][0]=unit.m[1][1]=1; unit.m[0][1]=unit.m[1][0]=0; } Matrix mul(Matrix &a,Matrix &b) { Matrix c; for(int i=0;i<2;i++) for(int j=0;j<2;j++) { c.m[i][j]=0; for(int k=0;k<2;k++) { c.m[i][j]+=a.m[i][k]*b.m[k][j]; c.m[i][j]%=ma; } } return c; } Matrix Pow(int n) { Matrix p=unit,base=mat; while(n) { if(n&1) p=mul(p,base); n>>=1; base=mul(base,base); } return p; } int main() { int _case; Initiate(); scanf("%d",&_case); while(_case--) { scanf("%d %d",&n,&ma); Matrix ans=Pow(n); printf("%d\n",ans.m[0][1]);//or ans.m[1][0]; } return 0; }
代码风格来自队友hjh:http://www.cnblogs.com/wally/archive/2013/03/06/2945400.html