Cod sursa(job #1504418)

Utilizator radu_uniculeu sunt radu radu_unicul Data 17 octombrie 2015 18:32:44
Problema Iepuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.55 kb
#include<stdio.h>
using namespace std;
#define MOD 666013
int t,m[3][3],m2[3][3],result[3][3],v[3][3];
void printmatrix(int a[3][3])
{
    for(int i=0; i<3; i++)
    {
        printf("\n");
        for(int j=0; j<3; j++) printf("%d ",a[i][j]);
    }
    printf("\n\n");
}

void power(int A[3][3],int B[3][3])
{
    int tmp[3][3];

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

    for(int i=0; i<3; i++)
        for(int j=0; j<3; j++) A[i][j]=tmp[i][j];
}
int main()
{
    freopen("iepuri.in","r",stdin);
    freopen("iepuri.out","w",stdout);
    scanf("%d",&t);
    for(int i=0; i<t; i++)
    {
        int x,y,z,a,b,c,n;
        scanf("%d %d %d %d %d %d %d",&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(int i=0; i<3; i++)
            for(int 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("%d\n",1LL * x * result[0][2] + 1LL * y * result[1][2] + 1LL * z * result[2][2]);
    }
}