记录编号 476520 评测结果 AAAAAAAAAA
题目名称 eins 最终得分 100
用户昵称 Gravatar胡嘉兴 是否通过 通过
代码语言 C++ 运行时间 2.738 s
提交时间 2017-11-25 11:59:23 内存使用 0.31 MiB
显示代码纯文本
#include<bits/stdc++.h>
#define N 5
#define ll long long
using namespace std;
ll p;
struct martrix
{
    ll A[N][N];
    void init()
    {
        memset(A, 0, sizeof(A));
        A[1][2] = A[2][1] = A[2][2] = 1;
    }
    martrix operator * (martrix& a)const{
        martrix ans;
        memset(ans.A, 0, sizeof(ans.A));
        for(int i = 1; i < 3; i++)
        {
            int j = 1;
            for(int k = 1; k < 3; k++)
            {
                ans.A[i][j] += A[i][k]*a.A[k][j];
            }
            ans.A[i][j] %= p;
        }
        /*for(int i = 1; i <= 1; i++)
        {
            for(int j = 1; j <= 3; j++)
            {
                for(int k = 1; k <= 3; k++)
                {
                    ans.A[i][j] += A[i][k]*a.A[k][j];
                    ans.A[i][j] %= MOD;
                }
            }
        }*/
        return ans;
    }
    martrix ppow()const{
        martrix ans;
        memset(ans.A, 0, sizeof(ans.A));
        for(int i = 1; i < 3; i++)
        {
            for(int j = 1; j < 3; j++)
            {
                for(int k = 1; k < 3; k++)
                {
                    ans.A[i][j] += A[i][k]*A[k][j];
                }
                ans.A[i][j] %= p;
            }
        }
        return ans;
    }
};
martrix t, ans;
void qpow(int k)
{
    t.init();
    memset(ans.A, 0, sizeof(ans.A));
    ans.A[2][1] = 1;
    while(k)
    {
        if(k&1)
        {
            ans = t*ans;
        }
        t = t.ppow();
        k >>= 1;
    }
    printf("%lld\n", ans.A[2][1]%p);
}
int main()
{
    int T, n;
    freopen("eins.in", "r", stdin);
    freopen("eins.out", "w", stdout);
    scanf("%d", &T);
    while(T--)
    {
        scanf("%d%lld", &n, &p);
        if(n==0)
        {
            puts("0");
            continue;
        }
        qpow(n-1);
    }
}