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
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();