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

来源:互联网 发布:联想笔记本的网络接口 编辑:程序博客网 时间:2024/05/08 07:18
斐波那契数列的性质 - 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;}


原创粉丝点击