Cod sursa(job #346165)

Utilizator kungfuNoName kungfu Data 6 septembrie 2009 23:33:36
Problema Iepuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.89 kb
#include <fstream>
#include <iostream>
#include <stdarg.h>
#include <vector>
#include <string>
#include <sstream>

using namespace std;

const int M = 666013;
class matrix: vector < vector <int> > {
	private:
		int l,c;
	public:
		matrix();
		matrix(int l, int c, ...);
		matrix operator*(matrix);
		int get(int i, int j);	
		string toString();	
};

matrix::matrix()
{
	l = c = 0;
}

matrix::matrix(int l, int c, ...)
{
	va_list vl;
 
	this->l = l;
	this->c = c;
	this->resize(l);
	
	va_start(vl, c);
	for (int i = 0; i < l; ++i ){
		(*this)[i].resize(c);
		for (int j = 0; j < c; j++){
			(*this)[i][j] = va_arg(vl, int);
		}
	}
	va_end(vl);
}

matrix matrix::operator*(matrix m)
{
	matrix ret;
	
	ret.l = this->l;
	ret.c = m.c;
	ret.resize(this->l);
	for (int i = 0; i < this->l; ++i){
		ret[i].resize(m.c);
		for (int j = 0; j < m.c; ++j){
			long long s = 0;
			for (int k = 0; k < m.l; ++k){
				s += ( (long long) (*this)[i][k] * m[k][j]) % M;
			}
			ret[i][j] = s % M;
		}
	}
	return ret;		
}

int matrix::get(int i, int j){
	return (*this)[i][j];
}
string matrix::toString(){
	string ret("value: ");
	for (int i = 0 ; i<l; ++i){
		ret.append("\n");
		for (int j = 0; j<c; ++j){
			stringstream out;
			out << (*this)[i][j] << " ";
			ret.append(out.str());
		}
	}
	return ret;		
}

int sol (int A, int B, int C, int X, int Y, int Z, int N)
{
	matrix a0 = matrix(3, 1, X, Y, Z);
	matrix a = matrix(3, 3, 0, 1, 0, 0, 0, 1, C, B, A);
	matrix ret = matrix(3,3, 1, 0, 0, 0, 1, 0, 0, 0, 1);

	for (int i = 0; (1 << i) <= N; ++i)
	{
		if (((1 << i) & N) > 0)
		{
			ret = ret * a;
		}
		a = a * a;
	}
	
	matrix final = ret * a0;
	return final.get(0, 0);		 	
}

int main()
{
	int T, A, B, C, X, Y, Z, N;
	ifstream fin("iepuri.in");
	ofstream fout("iepuri.out");

	fin >> T;
	for (T; T > 0; --T){
		fin >> A >> B >> C >> X >> Y >> Z >> N;
		fout << sol(A, B, C, X, Y , Z, N) << endl;
	}
	fin.close();
	fout.close();
	
	return 0;
}