Cod sursa(job #1045981)

Utilizator hevelebalazshevele balazs hevelebalazs Data 2 decembrie 2013 15:39:13
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.11 kb
#include <stdio.h>
#define fr(i,a,b) for(int i=a;i<b;++i)
#define ll long long
#define MOD 666013
ll a[3][3],an[3][3];
void prod(ll(*a)[3],ll(*b)[3]){ //a=a*b
    ll t[3][3],tb[3][3];
    fr(i,0,3)fr(j,0,3)t[i][j]=a[i][j],tb[i][j]=b[i][j];
    fr(c,0,3){
        fr(r,0,3){
            a[r][c]=0;
            fr(i,0,3)a[r][c]+=t[r][i]*tb[i][c];
            a[r][c]%=MOD;
            }
        }
    }
void exp(int n){
    if(n==0){
        fr(i,0,3)fr(j,0,3) an[i][j]=i==j;
        return;
        }
    exp(n/2);
    prod(an,an);
    if(n%2) prod(an,a);
    }
int main(){
    freopen("iepuri.in","r",stdin);
    freopen("iepuri.out","w",stdout);
    int t;
    scanf("%i",&t);
    fr(t1,0,t){
        int x,y,z;
        scanf("%i%i%i",&x,&y,&z);
        int A,B,C;
        scanf("%i%i%i",&A,&B,&C);
        a[0][0]=a[0][2]=a[1][0]=a[1][1]=0;
        a[0][1]=a[1][2]=1;
        a[2][0]=C,a[2][1]=B,a[2][2]=A;
        int n;
        scanf("%i",&n);
        exp(n);
        ll s=an[0][0]*x+an[0][1]*y+an[0][2]*z;
        s%=MOD;
        printf("%lli\n",s);
        }
    return 0;
    }