Cod sursa(job #1358337)

Utilizator karlaKarla Maria karla Data 24 februarie 2015 15:57:50
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.47 kb
#include <stdio.h>
#define MOD 666013
#define DIM 5

using namespace std;
 
FILE*f=fopen("iepuri.in","r"),*g=fopen("iepuri.out","w");
 
long long t, m[5][5], in[5][5], sol[2][5], r[5][5];
 
void inmultire(long long a[DIM][DIM], long long b[DIM][DIM], long long c[DIM][DIM], long long n){
	long long i,j,k;
	for (i=1;i<=n;i++)
		for (j=1;j<=n;j++) {
			c[i][j] = 0;
			for (k=1;k<=n;k++) {
				c[i][j] += a[i][k]*b[k][j];
				c[i][j] %= MOD;
			}
		}
	
}

void copiere(long long a[DIM][DIM], long long b[DIM][DIM], long long n) {
	long long i,j;
	for (i=1;i<=n;i++)
		for (j=1;j<=n;j++)
			a[i][j] = b[i][j];
}


void identitate(long long a[DIM][DIM], long long n) {
	long long i,j;
	for (i=1;i<=n;i++)
		for (j=1;j<=n;j++)
			if (i==j)
				a[i][j] = 1;
			else
				a[i][j] = 0;
}


int main()
{
    fscanf(f,"%lld",&t);
    long long x, y, z, A, B, C, n, sum, aux[5][5], p;
    m[2][1] = 1;
    m[3][2] = 1;
    for(long long i = 1; i <= t; i ++)
    {
        fscanf(f,"%lld %lld %lld %lld %lld %lld %lld",&x, &y, &z, &A, &B, &C, &n);
        m[1][1] = A;
        m[1][2] = B;
        m[1][3] = C;
		
		identitate(r, 3);
		copiere(in, m, 3);
		
		p = n-2;
		while (p) {
			if (p % 2 == 1) {
				inmultire(r, in, aux, 3);
				copiere(r, aux, 3);
			}
			inmultire(in, in, aux, 3);
			copiere(in, aux, 3);
			p = p/2;
		}
		
		sum = (r[1][1]*z + r[1][2]*y + r[1][3]*x)%MOD;

        fprintf(g,"%lld\n",sum);
 
    }
    return 0;
}