Cod sursa(job #176285)

Utilizator c_sebiSebastian Crisan c_sebi Data 10 aprilie 2008 22:33:06
Problema Fractal Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.79 kb
#include <fstream.h>

long int A(long int, int, int);
long int B(long int, int, int);
long int C(long int, int, int);
long int D(long int, int, int);

long A(long int n, int col, int lin){
	if(n){
	int c;
	if(col <= n/2)
		if(lin <= n/2) c = 1;
		else c = 2;
	else
		if(lin<=n/2) c = 4;
		else c = 3;

	if(c==1) return B(n/2, col, lin);
	if(c==2) return n*n/4 + A(n/2, col, lin-n/2);
	if(c==3) return n*n/2 + A(n/2, col-n/2, lin-n/2);
	if(c==4) return (unsigned long)3*n*n/4 + C(n/2, col-n/2, lin);
}
}

long int B(long int n, int col, int lin){
	if(n){
	int c;
	if(col <= n/2)
		if(lin <= n/2) c = 1;
		else c = 4;
	else
		if(lin<=n/2) c = 2;
		else c = 3;

	if(c==1) return A(n/2, col, lin);
	if(c==2) return n*n/4 + B(n/2, col-n/2, lin);
	if(c==3) return n*n/2 + B(n/2, col-n/2, lin-n/2);
	if(c==4) return (unsigned long)3*n*n/4 + D(n/2, col, lin-n/2);
}
}

long int C(long int n, int col, int lin){
	if(n){
	int c;
	if(col <= n/2)
		if(lin <= n/2) c = 3;
		else c = 2;
	else
		if(lin<=n/2) c = 4;
		else c = 1;

	if(c==1) return D(n/2, col-n/2, lin-n/2);
	if(c==2) return n*n/4 + C(n/2, col, lin-n/2);
	if(c==3) return n*n/2 + C(n/2, col, lin);
	if(c==4) return (unsigned long)3*n*n/4 + A(n/2, col-n/2, lin);
}
}

long int D(long int n, int col, int lin){
	if(n){
	int c;
	if(col <= n/2)
		if(lin <= n/2) c = 3;
		else c = 4;
	else
		if(lin<=n/2) c = 2;
		else c = 1;

	if(c==1) return C(n/2, col-n/2, lin-n/2);
	if(c==2) return n*n/4 + D(n/2, col-n/2, lin);
	if(c==3) return n*n/2 + D(n/2, col, lin);
	if(c==4) return (unsigned long)3*n*n/4 + C(n/2, col, lin-n/2);
}
}


int main(){
	long int n;
	int x, y;
	ifstream f("fractal.in");
	ofstream g("fractal.out");
	f>>n>>x>>y;
	f.close();
	g<<A((long)1<<n, x, y);
	g.close();
	return 0;
}