#include using namespace std; const int NWEIGHTS = 200; int CaseNo=1; long long gcd(long long a, long long b) { if (b == 0) return a; else return gcd(b, a%b); } class frac{ public: long long num, den; frac(int n, int d) { num = n, den = d; } frac() { num = 0, den = 1; } frac operator+(frac& rhs) { long long n = num*rhs.den + den*rhs.num; long long d = den*rhs.den; long long div = gcd(n, d); return frac(n/div, d/div); } frac operator*(frac& rhs) { long long n = num*rhs.num; long long d = den*rhs.den; long long div = gcd(n, d); return frac(n/div, d/div); } frac operator*(int rhs) { long long n = num*rhs; long long div = gcd(n, den); return frac(n/div, den/div); } frac operator/(frac& rhs) { long long n = num*rhs.den; long long d = den*rhs.num; long long div = gcd(n, d); return frac(n/div, d/div); } void insert(ostream& out) { out << num << '/' << den; } }; ostream & operator<<(ostream& out, frac& f) { f.insert(out); return out; } const frac ONE(1,1); const frac ZERO(0,1); struct arm { frac total; frac weights[NWEIGHTS]; int d1, d2; int arm1, arm2; bool done; } arms[2*NWEIGHTS-1]; bool processArm(int a, int n) { if (arms[a].done) return false; int arm1 = arms[a].arm1; int arm2 = arms[a].arm2; if (!arms[arm1].done || !arms[arm2].done) return false; frac f1 = arms[arm1].total*arms[a].d1; frac f2 = arms[arm2].total*arms[a].d2; frac f = f1/f2; frac total; for(int i=0; i> n; while (n != 0) { int numdone = 0; int newarm = n; for(int i=0; i<2*n+1; i++) { for(int j=0; j<=n; j++) arms[i].weights[j] = ZERO; arms[i].done = false; } for(int i=0; i> arms[i].d1 >> arms[i].d2; char t1, t2; int n1, n2; cin >> t1 >> t2 >> n1 >> n2; n1--; n2--; if (t1 == 'W') { arms[newarm].weights[n1] = ONE; arms[newarm].total = ONE; arms[newarm].done = true; arms[i].arm1 = newarm; newarm++; } else { arms[i].arm1 = n1; } if (t2 == 'W') { arms[newarm].weights[n2] = ONE; arms[newarm].total = ONE; arms[newarm].done = true; arms[i].arm2 = newarm; newarm++; } else { arms[i].arm2 = n2; } } int last; while (numdone < n) { for(int i=0; i> w >> minval; w--; int maxDen = arms[last].weights[0].den; for(int j=1; j<=n; j++) { maxDen /= gcd(maxDen, arms[last].weights[j].den); maxDen *= arms[last].weights[j].den; } long long sum = 0; for(int j=0; j<=n; j++) { arms[last].weights[j] = arms[last].weights[j]*maxDen; sum += arms[last].weights[j].num; if ((maxDen/arms[last].weights[j].den)*arms[last].weights[j].den != maxDen) cout << "Error in normalizing" << endl; } int factor = (minval-1)/arms[last].weights[w].num + 1; cout << "Case "<> n; } }