您的位置:首页 > 其它

NZAU 1202: GCD 矩阵快速幂 gcd和fib数列一些结论

2017-07-19 17:01 246 查看
斐波那契数列的性质 - 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: