Cod sursa(job #1504420)

Utilizator radu_uniculeu sunt radu radu_unicul Data 17 octombrie 2015 18:35:15
Problema Iepuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.48 kb
#include<stdio.h>
using namespace std;
#define MOD 666013
long long  t,m[3][3],m2[3][3],result[3][3],v[3][3];
void power(long long  A[3][3],long long  B[3][3])
{
    long long  tmp[3][3];

    for ( long long  i = 0; i < 3; i++ )
    {
        for ( long long  j = 0; j < 3; j++ )
        {
            tmp[i][j] = 0;
            for ( long long  k = 0; k < 3; k++ )
            {
                tmp[i][j] = (tmp[i][j] + 1LL * A[i][k] * B[k][j]) % MOD;
            }
        }
    }

    for(long long  i=0; i<3; i++)
        for(long long  j=0; j<3; j++) A[i][j]=tmp[i][j];
}
int main()
{
    freopen("iepuri.in","r",stdin);
    //freopen("iepuri.out","w",stdout);
    scanf("%lld",&t);
    for(long long  i=0; i<t; i++)
    {
        long long  x,y,z,a,b,c,n;
        scanf("%lld %lld %lld %lld %lld %lld %lld",&x,&y,&z,&a,&b,&c,&n);
        m[0][0] = 0;
        m[0][1] = 0;
        m[0][2] = c;
        m[1][0] = 1;
        m[1][1] = 0;
        m[1][2] = b;
        m[2][0] = 0;
        m[2][1] = 1;
        m[2][2] = a;
        for(long long  i=0; i<3; i++)
            for(long long  j=0; j<3; j++) if(i==j) result[i][j]=1;
                else result[i][j]=0;
        n -= 2;
        while(n)
        {
            if(n % 2)
            {
                power(result, m);
            }
            power(m, m);
            n >>= 1;
        }
        printf("%lld\n",1LL * x * result[0][2] + 1LL * y * result[1][2] + 1LL * z * result[2][2]);
    }
}