Cod sursa(job #1468605)

Utilizator pepsiM4A1Ozturk Arif pepsiM4A1 Data 6 august 2015 15:01:15
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.59 kb
#include <cstdio>
#define MOD 666013
int n,a,b,c,x,y,z;
struct str
{
    long long m[5][5];
};
str in,fin;
long long res[5];
void defineste()
{
    in.m[1][1]=0;
    in.m[2][1]=1;
    in.m[3][1]=0;
    in.m[1][2]=0;
    in.m[2][2]=0;
    in.m[3][2]=1;
    in.m[1][3]=c;
    in.m[2][3]=b;
    in.m[3][3]=a;
    for(int i=1;i<=3;i++)
    {
        for(int j=1;j<=3;j++) fin.m[i][j]=0;
        fin.m[i][i]=1;
    }
}
int lg(int nr)
{
    int ct=0;
    while(nr>1)
    {
        nr>>=1;
        ct++;
    }
    return ct;
}
str inm(str a,str b)
{
    str c;
    for(int i=1;i<=3;i++)
    {
        for(int j=1;j<=3;j++) c.m[i][j]=0;
    }
    for(int i=1;i<=3;i++)
    {
        for(int j=1;j<=3;j++)
        {
            for(int k=1;k<=3;k++)
            {
                c.m[i][j]+=(a.m[i][k]*b.m[k][j]);
                c.m[i][j]%=MOD;
            }
        }
    }
    return c;
}
void solve()
{
    n-=2;
    int s=lg(n);
    for(int i=0;i<=s;i++)
    {
        if(n&(1<<i))
        {
            fin=inm(fin,in);
        }
        in=inm(in,in);
    }
}
int main()
{
    freopen ("iepuri.in","r",stdin);
    freopen ("iepuri.out","w",stdout);
    int t;
    scanf("%d",&t);
    for(int xyz=1;xyz<=t;xyz++)
    {
        scanf("%d%d%d",&x,&y,&z);
        scanf("%d%d%d%d",&a,&b,&c,&n);
        defineste();
        solve();
        res[3]+=x*fin.m[1][3];
        res[3]%=MOD;
        res[3]+=y*fin.m[2][3];
        res[3]%=MOD;
        res[3]+=z*fin.m[3][3];
        res[3]%=MOD;
        printf("%d\n",res[3]);
        res[3]=0;
    }
}