斐波那契数列的性质 - Milkor - 博客园
http://www.cnblogs.com/Milkor/p/4734763.html
fn * 1 1 = fn-1
fn-1 1 0 fn-2
所以 1 1 ^ n * 1 结果中的 第二行第一列的值就是fn
1 0 0
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <vector>
#include <map>
#include <cmath>
#include <set>
#include <queue>
using namespace std;
const int INF=1e9+10;
typedef long long ll;
ll gcd(ll a,ll b){
return b?gcd(b,a%b):a;
}
typedef vector<ll> vec;
typedef vector<vec> mat;
int mod;
mat mul(mat &A,mat &B){
mat C(A.size(),vec(B[0].size()));
for(int i=0;i<(int)A.size();i++)
for(int k=0;k<(int)B.size();k++)
for(int j=0;j<(int)B[0].size();j++)
C[i][j]=(1LL*C[i][j]+1LL*A[i][k]*B[k][j])%mod;
return C;
}
mat matpow(mat A,ll n){
mat B(A.size(),vec(A.size()));
for(int i=0;i<(int)A.size();i++)
B[i][i]=1;
while(n){
if(n&1) B=mul(B,A);
A=mul(A,A);
n>>=1;
}
return B;
}
int main(){
int a,b;
int T;
scanf("%d",&T);
while(T--){
scanf("%d %d %d",&a,&b,&mod);
mat A(2,vec(2));
A[0][0]=1; A[0][1]=1;
A[1][0]=1; A[1][1]=0;
int k=gcd(a+2,b+2);
A=matpow(A,k);
printf("%d\n",A[1][0] );
}
return 0;
}