Cod sursa(job #1651789)

Utilizator VladTiberiuMihailescu Vlad Tiberiu VladTiberiu Data 13 martie 2016 21:27:14
Problema Iepuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.87 kb
#include <fstream>
#include <cstdio>
#include <vector>
#include <cstring>
#include <queue>
#include <set>
#include <stack>
#include <algorithm>
#include <cmath>
#include <iomanip>

#define INF 0x3f3f3f3f
#define mod 666013

using namespace std;

int M[4][4];
int t,x,y,z,q,w,e,n;

void inm(int r[4][4],int a[4][4]){
    int w[4][4];
    for(int i = 1; i <= 3; ++i){
        for(int j = 1; j <= 3; ++j){
            int s = 0;
            for(int k = 1; k <= 3; ++k){
                s += (((r[i][k] % mod)*(a[k][j] % mod)) % mod);
            }
            w[i][j] = s % mod;
        }
    }
    for(int i = 1; i <= 3; ++i){
        for(int j = 1; j <= 3; ++j){
            r[i][j] = w[i][j] % mod;
        }
    }
}
void power_mat(int a[4][4],int p){
    int r[4][4];
    r[1][1] = 1; r[1][2] = 0; r[1][3] = 0;
    r[2][1] = 0; r[2][2] = 1; r[2][3] = 0;
    r[3][1] = 0; r[3][2] = 0; r[3][3] = 1;
    while(p){
        if(p % 2 == 1){
            p--;
            inm(r,a);
        }
        p /= 2;
        inm(a,a);
    }
    for(int i = 1; i <= 3; ++i){
        for(int j = 1; j <= 3; ++j){
            a[i][j] = r[i][j] % mod;
        }
    }
}
int main()
{
    freopen("iepuri.in","r",stdin);
    freopen("iepuri.out","w",stdout);
    scanf("%d",&t);
    for(int count = 1; count <= t; ++count){
        scanf("%d%d%d%d%d%d%d",&x,&y,&z,&q,&w,&e,&n);
        M[1][1] = 0; M[1][2] = 1; M[1][3] = 0;
        M[2][1] = 0; M[2][2] = 0; M[2][3] = 1;
        M[3][1] = e; M[3][2] = w; M[3][3] = q;
        n -= 2;

        power_mat(M,n);
        printf("%d\n",(M[3][1]*x % mod + M[3][2]*y % mod + M[3][3]*z % mod) % mod);
     /*   for(int i = 1; i <= 3; ++i){
            for(int j = 1; j <= 3; ++j){
                printf("%d ",M[i][j]);
            }
            printf("\n");
        }
        printf("\n");   */
    }
    return 0;
}