14.01.2013 Views

Soluciones y Explicación de los problemas ACM ... - ICPC Bolivia

Soluciones y Explicación de los problemas ACM ... - ICPC Bolivia

Soluciones y Explicación de los problemas ACM ... - ICPC Bolivia

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

Explicaciones a <strong>los</strong> <strong>problemas</strong> South American Regionals 2008 51<br />

if(numerador==0)<strong>de</strong>nominador=1;<br />

//infinitas soluciones, asi que buscamos el menor (0,1)<br />

else return false;//no existe solucion<br />

}else if(numerador==0)<strong>de</strong>nominador=1;<br />

//para evitar respuestas <strong>de</strong>l tipo 0/358... y convertirlas a 0/1<br />

else reducir();//volviendo a fraccion irreducible.<br />

return true;//entonces si se llego a una solucion<br />

}<br />

void obtener_solucion(){//buscando la solucion en las ecuaciones <strong>de</strong> r<br />

bool ok=true;//por ahora existe solucion<br />

numerador=b2-b1;//creando una posible solucion<br />

<strong>de</strong>nominador=a1-a2;<br />

if(<strong>de</strong>nominador==0){<br />

if(numerador==0)ok=busca_solucion_theta();<br />

//infinitas soluciones, asi que buscamos en theta<br />

else ok=false;<br />

//no existen soluciones<br />

}else if(numerador*<strong>de</strong>nominador>=0){<br />

//hay solucion si es positiva<br />

if(numerador==0)<strong>de</strong>nominador=1;<br />

//para evitar respuestas <strong>de</strong>l tipo 0/358... y convertirlas a 0/1<br />

else{<br />

numerador= labs(numerador);<strong>de</strong>nominador= labs(<strong>de</strong>nominador);<br />

// volviendo<strong>los</strong> positivos, evita solucion -2,-6<br />

reducir(); //volviendo a fraccion irreducible.<br />

}<br />

if(ok){ //si hasta ahora no ha fallado nada, se comprueba la solucion en theta<br />

long th1=c1*numerador+d1*<strong>de</strong>nominador;<br />

long th2=c2*numerador+d2*<strong>de</strong>nominador;<br />

ok=(a1*numerador+b1*<strong>de</strong>nominador==0)||((th1-th2)%(360*<strong>de</strong>nominador)==0);<br />

//verdad si r1==0 o es solucion <strong>de</strong> theta<br />

}<br />

}else ok=false;//solucion negativa, se <strong>de</strong>scarta<br />

if(!ok){<br />

numerador=INFINITO;//si no hay solucion, se la pone en infinita<br />

<strong>de</strong>nominador=1;<br />

}<br />

}<br />

int main(){<br />

long num1,num2,<strong>de</strong>n1,<strong>de</strong>n2;<br />

while((cin>>a1>>b1>>c1>>d1>>a2>>b2>>c2>>d2)&&<br />

(a1||b1||c1||d1||a2||b2||c2||d2)){<br />

obtener_solucion();//obteniendo solucion <strong>de</strong> la manera normal<br />

num1=numerador,<strong>de</strong>n1=<strong>de</strong>nominador;//guardando solucion<br />

a2*=-1;b2*=-1;d2+=180;//obteniendo solucion <strong>de</strong> la segunda manera<br />

obtener_solucion();

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!