POJ 3070 矩阵经典6 最基础的Fibonacci递推

来源:互联网 发布:淘宝瑜伽服哪家店铺好 编辑:程序博客网 时间:2024/05/21 11:25

#include<cstdio>#include<cstring>using namespace std;typedef long long int ll;const ll mod = 10000;const int maxn=3;struct matrix{    ll arr[maxn][maxn];    matrix operator*(matrix b){        matrix ans;        ll tmp;        for(int i=0; i<maxn; i++)        for(int j=0; j<maxn; j++){            ans.arr[i][j] = 0;            for(int k=0; k<maxn; k++){                tmp = (arr[i][k]*b.arr[k][j])%mod;                ans.arr[i][j] = (ans.arr[i][j] + tmp)%mod;            }        }        return ans;    }};matrix quick_pow(matrix a,ll N){    matrix ans;    memset(ans.arr,0,sizeof(ans.arr));    for(int i=0; i<maxn; i++)        ans.arr[i][i] = 1;    while(N){        if(N&1)            ans = ans*a;        a = a*a;        N /= 2;;    }    return ans;}int main(){    ll n;    matrix a;    while(scanf("%lld",&n)&&n!=-1){        if(n==0){            printf("0\n");            continue;        }        memset(a.arr,0,sizeof(a.arr));        int b[2][2]={1,1,1,0};        for(int i=0;i<2;i++)        for(int j=0;j<2;j++)            a.arr[i][j]=b[i][j];        a=quick_pow(a,n-1);        printf("%lld\n",a.arr[0][0]);    }    return 0;}


原创粉丝点击