#include unsigned int gcd(int a,int b); void Divisor(unsigned int* a,unsigned int* b); unsigned int saiki(int point); void setMobile(int n); struct mobile{ unsigned int lenR,lenL,rm,lm,parentsM; }; mobile mobiles[103]; int main(){ int n; scanf("%d",&n); while(n!=0){ setMobile(n); scanf("%d",&n); } } void setMobile(int n){ for(int i=1;i<=n;i++){ mobiles[i].parentsM=0; } for(int i=1;i<=n;i++){ scanf("%d %d %d %d",&mobiles[i].lenR,&mobiles[i].lenL,&mobiles[i].rm,&mobiles[i].lm); if(mobiles[i].rm!=0){ mobiles[mobiles[i].rm].parentsM=i; } if(mobiles[i].lm!=0){ mobiles[mobiles[i].lm].parentsM=i; } } int point=1; while(mobiles[point].parentsM!=0){ point=mobiles[point].parentsM; } printf("%d\n",saiki(point)); } unsigned int saiki(int point){ int rightG=0,leftG=0; if(mobiles[point].rm>0){ rightG=saiki(mobiles[point].rm); } if(mobiles[point].lm>0){ leftG=saiki(mobiles[point].lm); } Divisor(&mobiles[point].lenR,&mobiles[point].lenL); int lenR=mobiles[point].lenR; int lenL=mobiles[point].lenL; if(leftG==0 && rightG==0){ int gc=gcd(lenR,lenL); //int tw=lenR*lenL/gc; //return tw/lenR+tw/lenL; return lenL/gc+lenR/gc; }else if(leftG==0 && rightG!=0){ int gc=gcd(rightG*lenR,lenL); //int tw=(lenR*rightG*lenL)/gc; return (rightG*lenL)/gc+(rightG*lenR)/gc; }else if(leftG!=0 && rightG==0){ int gc=gcd(leftG*lenL,lenR); //int tw=(leftG*lenL*lenR)/gc; //return tw/lenR+tw/lenL; return leftG*lenL/gc+leftG*lenR/gc; }else{ int gc=gcd(leftG*lenL,rightG*lenR); //int tw=leftG*rightG*lenL*lenR/gc; //return tw/lenR+tw/lenL; return (leftG*lenL)/gc*rightG+(rightG*lenR)/gc*leftG; } } void Divisor(unsigned int* a,unsigned int* b){ int wari=2; int m,n; m=*a; n=*b; while(wari