hdu 2855

来源:互联网 发布:冒险岛数据库17173 编辑:程序博客网 时间:2024/05/17 01:21

暴力打表找规律: = F(2n)。

#include <map>#include <set>#include <list>#include <queue>#include <deque>#include <stack>#include <string>#include <time.h>#include <cstdio>#include <math.h>#include <iomanip>#include <cstdlib>#include <limits.h>#include <string.h>#include <iostream>#include <fstream>#include <algorithm>using namespace std;#define LL long long#define MIN INT_MIN#define MAX INT_MAX#define PI acos(-1.0)#define N 2#define FRE freopen("input.txt","r",stdin)#define FF freopen("output.txt","w",stdout);#define LL long long#define MIN INT_MIN#define MAX INT_MAX#define PI acos(-1.0)#define N 2#define FRE freopen("input.txt","r",stdin)#define FF freopen("output.txt","w",stdout);int MOD;struct Mat{    LL mat[N][N];};//初始化单位矩阵Mat init(){    Mat E;    for(LL i = 0; i < N; i++){        for(LL j = 0; j < N; j++){            if(i == j)            E.mat[i][i] = 1;            else            E.mat[i][j] = 0;        }    }    return E;}//重载乘法Mat operator *(Mat a,Mat b){    Mat c;    memset(c.mat,0,sizeof(Mat));    for(LL i = 0; i < N; i++){        for(LL j = 0; j < N; j++){            for(LL k = 0; k < N; k++){                if(a.mat[i][k] && b.mat[k][j]){                    c.mat[i][j] = (c.mat[i][j] + a.mat[i][k] * b.mat[k][j]) % MOD;                }            }        }    }    return c;}//重载加法Mat operator +(Mat a,Mat b){    Mat c;    memset(c.mat,0,sizeof(Mat));    for(LL i = 0; i < N; i++){        for(LL j = 0; j < N; j++){            c.mat[i][j] = (a.mat[i][j] + b.mat[i][j]) % MOD;        }    }    return c;}//重载幂次方Mat operator ^(Mat A,LL x){    if(x == 1)return A;    Mat c;    c = init();    for(; x ; x >>= 1){        if(x&1){            c = c*A;        }        A = A*A;    }    return c;}int main(){    LL n,m;    Mat gao;    gao.mat[0][0] = 1;    gao.mat[0][1] = 1;    gao.mat[1][0] = 1;    gao.mat[1][1] = 0;    int t;    scanf("%d\n",&t);    while(t--){        scanf("%I64d%I64d",&n,&m) ;        LL ans;        MOD = m;        if(!n)ans = 0;        else{            Mat res;            res = gao^(2*n);            ans = res.mat[0][1];        }        printf("%d\n",ans % MOD);    }    return 0;}

原创粉丝点击