Cod sursa(job #856885)

Utilizator razvan9310FMI - Razvan Damachi razvan9310 Data 17 ianuarie 2013 05:05:27
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <fstream>
#include <iostream>
#define mod 666013
using namespace std;

unsigned long long *inm(unsigned long long *a, unsigned long long *b)
{
	unsigned long long i, *c = new unsigned long long[9];
	c[0] = (a[0]*b[0] + a[1]*b[3] + a[2]*b[6])%mod;
	c[1] = (a[0]*b[1] + a[1]*b[4] + a[2]*b[7])%mod;
	c[2] = (a[0]*b[2] + a[1]*b[5] + a[2]*b[8])%mod;
	c[3] = (a[3]*b[0] + a[4]*b[3] + a[5]*b[6])%mod;
	c[4] = (a[3]*b[1] + a[4]*b[4] + a[5]*b[7])%mod;
	c[5] = (a[3]*b[2] + a[4]*b[5] + a[5]*b[8])%mod;
	c[6] = (a[6]*b[0] + a[7]*b[3] + a[8]*b[6])%mod;
	c[7] = (a[6]*b[1] + a[7]*b[4] + a[8]*b[7])%mod;
	c[8] = (a[6]*b[2] + a[7]*b[5] + a[8]*b[8])%mod;
	return c;
}

unsigned long long *logpow(unsigned long long *a, unsigned long long p)
{
	if (p == 1) return a;
	if (p%2 == 0)
	{
		unsigned long long *c = logpow(a, p>>1);
		return inm(c, c);
	}
	else
	{
		unsigned long long *d = inm(a, logpow(a, p-1));
		return d;
	}
}

int main()
{
	ifstream in("iepuri.in"); ofstream out("iepuri.out");
	int a, b, c, x, y, z, n, t, i;
	unsigned long long *m = new unsigned long long[9];
	in>>t;
	for (i=0; i<t; ++i)
	{
		m[3]=1; m[4]=0; m[5]=0; m[6]=0; m[7]=1; m[8]=0;
		in>>x>>y>>z>>a>>b>>c>>n;
		m[0]=a; m[1]=b; m[2]=c;
		m = logpow(m, n-2);
		out<<(m[2]*x + m[1]*y + m[0]*z)%mod<<"\n";
	}
	return 0;
}