#include #include #include #include #define CURR 3 #define NUM 2 struct kurz { int a; int b; }; int min (int a, int b) { if (a > b) return (b); else return (a); } int max (int a, int b) { if (a > b) return (a); else return (b); } int nsd (int a, int b) { int i,tmp,tmp2; tmp = min(a,b); tmp2 = max(a,b); for (i = 1; i < tmp; i++) { if (tmp%tmp-i == 0 && tmp2%tmp-i == 0) return (tmp-i); } return (1); } int jevic (struct kurz a, struct kurz b) { if (a.a*b.b > b.a * a.b) return (-1); if (a.a*b.b == b.a * a.b) return (0); if (a.a*b.b < b.a * a.b) return (1); return (0); } char arbitage (struct kurz a) { return (a.a == a.b); } struct kurz soucet (struct kurz a, struct kurz b) { struct kurz k; int tmp; tmp = k.a = a.a + b.a; k.b = a.b + b.b; tmp = nsd(k.a,k.b); k.a /= tmp; k.b /= tmp; return (k); } int main (void) { int i,j,k; int m,n; char **slovnik; char currency[4]; struct kurz k1; int a,b; struct kurz ** kurzy; struct kurz ku; int tmp; while (1) { scanf("%d",&n); if (n == 0) break; /* zacatek alokace */ /* ------------------------ */ slovnik = (char **) malloc (n*sizeof(char *)); for (i = 0; i < n; i++) { slovnik[i] = (char *) malloc ((CURR+1)*sizeof(char)); } kurzy = (struct kurz **) malloc (n*sizeof(struct kurz *)); for (i = 0; i < n; i++) { kurzy[i] = (struct kurz *) malloc(NUM*sizeof(struct kurz)); } /* konec alokace */ /* ------------------------- */ /* nulovani */ for (i = 0; i < n; i++) { kurzy[i]->a = INT_MAX; kurzy[i]->b = 1; } a = 0; b = 0; /* konec nulovani */ for (i = 0; i < n; i++) { scanf("%s",slovnik[i]); } scanf("%d",&m); for (j = 0; j < m; j++) { /* nacteni jednotlivych men */ scanf("%s",currency); for (k = 0; k < n; k++) { if ( strcmp(currency,slovnik[k]) == 0 ) { a = k; break; } } scanf("%s",currency); for (k = 0; k < n; k++) { if ( strcmp(currency,slovnik[k]) == 0 ) { b = k; break; } } /* nacteni kurzu */ scanf("%d:%d",&ku.a,&ku.b); kurzy[a][b] = ku; } for (i = 0; i < n; i++) { for (j = 0; j < n; j++) { for (k = 0; k < n; k++) { /* !!!! */ tmp = jevic( kurzy[i][j],soucet(kurzy[i][j],kurzy[j][k]) ); if ( tmp == 1) kurzy[i][j] = soucet(kurzy[i][j],kurzy[j][k]); } } } k1.a = 1; k1.b = 1; for (i = 0; i < n; i++) { if (jevic(k1,kurzy[i][i])) { printf("Arbitrage\n"); goto neco; } } printf("Ok\n"); neco: for (i = 0; i < n; i++) { free(slovnik[i]); } free(slovnik); for (i = 0; i < n; i++) { free(kurzy[i]); } free(kurzy); /* ------------------------- */ /* dealokace */ } return (0); }