#include #include #include #include #include #include #include #include #include #include #include #include using namespace std; typedef unsigned int uint; typedef unsigned char uchar; typedef unsigned long long ulonglong; bool hasInput(); void readInput(); bool calculate(); void writeOutput(); void reset(); uint numRows = 0; int n; string* meny; int cn; double m[200][200]; double bestPath(uint from, uint to, set& visited); int main(int argc, char **argv) { cin >> n; while (n > 0) { readInput(); //writeOutput(); /*bool found = false; for (uint mena = 0; mena < n; mena++) { set visited; double path = bestPath(mena, mena, visited); if (path > 1.0) { cout << "Arbitrage" << endl; found = true; break; } } if (!found) cout << "Ok" << endl;*/ if (calculate()) cout << "Arbitrage" << endl; else cout << "Ok" << endl; //cout << endl; // writeOutput(); cin >>n; } return 0; } bool hasInput() { cin >> numRows; return numRows > 0; } void readInput() { meny = new string[n]; for (int r = 0; r < n; ++r) { cin >> meny[r]; } cin >> cn; //m = new float[n][n]; for (int rr = 0; rr < cn; ++rr) { string m1, m2; int k1, k2; cin >> m1; cin >> m2; cin >> k1; char ch; cin >> ch; cin >> k2; for (int i = 0; i < n; ++i) { if(meny[i] == m1) { for (int j = 0; j < n; ++j) { if(meny[j] == m2) { m[i][j] = (double)k1 / (double)k2; } } } } } delete[] meny; //cout << "a" << endl; } double calc(int i, int j) { if (m[i][j] != 0) return m[i][j]; for (int k=0; k < n; k++) { //cout << k << endl; if (k == i) continue; if (m[k][j] != 0) { m[i][j] = m[k][j] * calc(i, k); return m[i][j]; } } return 0; } double bestPath(uint from, uint to, set& visited) { if (from == to && visited.find(from) != visited.end()) return 1.0; visited.insert(to); double best = 0.0; for (uint newTo = 0; newTo < n; newTo++) { if (m[newTo][to] > 0 && visited.find(newTo) != visited.end()) { double path = bestPath(from, newTo, visited) * m[newTo][to]; if (path > best) best = path; } } visited.erase(to); return best; } bool calculate() { for (int i = 0; i < n; i++) { for (int j = i+1; j < n; j++) { if (i == j) continue; bool test = true; calc(i,j); calc(j,i); //cout << "b" << endl; if (m[i][j] != 0 && m[j][i] != 0 ) { if ((m[i][j] * m[j][i]) < 1) { return true; } } } //cout << "c" << endl; } return false; } void writeOutput() { for (int i = 0; i < cn; ++i) { for (int j = 0; j < cn; ++j) cout << m[i][j] << " "; cout << endl; } }