Cod sursa(job #1816920)

Utilizator MirceaTMircea Timpuriu MirceaT Data 27 noiembrie 2016 09:19:37
Problema Sortare topologica Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
 #include<fstream>
#include<vector>
using namespace std;

ifstream fin("tritzi.in");
ofstream fout("tritzi.out");

unsigned t,n,p,dim;
unsigned mod,v1[4],v2[4];

struct matrice
{
    vector<vector<int> > v;
    matrice()
    {
        v.resize(dim+1,vector<int>(dim+1,0));
    }
    void unitate()
    {
        for(int i=1;i<=dim;i++) v[i][i]=1;
    }
    matrice operator *(const matrice &aux) const
    {
        matrice ret;
        for(int i=1;i<=dim;i++)
            for(int j=1;j<=dim;j++)
                for(int k=1;k<=dim;k++)
                    ret.v[i][j]=(ret.v[i][j]+1LL*v[i][k]*aux.v[k][j])%mod;
        return ret;
    }
};

matrice rid_put(matrice a,int n)
{
    matrice p;
    p.unitate();
    for(int i=1;i<=n;i<<=1)
    {
        if(n&i) p=p*a;
        a=a*a;
    }
    return p;
}

int main()
{

    fin>>t;
    for(int i=0;i<t;i++)
    {
        fin>>n>>mod;
        dim=3;
        matrice a;
        a.v[1][1]=1;
        a.v[1][2]=0;
        a.v[1][3]=1;
        a.v[2][1]=0;
        a.v[2][2]=1;
        a.v[2][3]=1;
        a.v[3][1]=1;
        a.v[3][2]=1;
        a.v[3][3]=1;

        a=rid_put(a,n-1);

        for(int i=1;i<=3;i++) v2[i]=0;

        v1[1]=1;
        v1[2]=1;
        v1[3]=1;

        for(int i=1;i<=3;i++)
        {
            for(int j=1;j<=3;j++)
            {
                 v2[i]=(v2[i]+1LL*v1[j]*a.v[j][i])%mod;
            }

        }
        fout<<(v2[1]+v2[2]+v2[3])%mod<<"\n";


    }

}