#include <iostream> using namespace std; unsigned long long nwd(unsigned long long a, unsigned long long b){ if(b == 0){ return a; } unsigned long long c = a%b; return nwd(b, c); } unsigned long long nww(unsigned long long a, unsigned long long b){ unsigned long long c = nwd(a, b); unsigned long long d = a * b / c; return d; } int main(){ std::ios_base::sync_with_stdio(false); std::cin.tie(NULL); int n; cin >> n; int *tab_dl = new int [n]; unsigned long long *tab_operacja = new unsigned long long [n]; unsigned long long *tab_ile = new unsigned long long [n]; int **tab_kierunki = new int*[n]; for(int i = 0; i < n; i++){ int tym_dl; cin >> tym_dl; tab_dl[i] = tym_dl; if(tym_dl == 0){ tab_kierunki[i] = new int [1]; tab_kierunki[i] = 0; } else{ tab_kierunki[i] = new int [tym_dl]; } tab_operacja[i] = 1; tab_ile[i] = 1; for(int j = 0; j < tym_dl;j++){ cin >> tab_kierunki[i][j]; } } int koniec = 0; // stan poczatkow, jeśli 0 unsigned long long l = 1; // int a, b; // cin >> a >> b; // cout << nwd(a, b) << endl; for(int i = 0; i < n; i++){ if(tab_dl[i] == 0 ){ continue; } if(i != 0 and tab_operacja[i] == 1){ continue; } if(tab_ile[i] == 1){ unsigned long long dl_tym = tab_dl[i]; tab_operacja[i] *= dl_tym; unsigned long long a = tab_operacja[i]; // unsigned long long a = tab_operacja[i]; for(int j = 0; j < dl_tym; j++){ int kierunek = tab_kierunki[i][j] - 1; if(tab_operacja[kierunek] == 1){ tab_operacja[kierunek] = a; } else{ unsigned long long b = nwd(tab_operacja[kierunek], a); //tab_ile[kierunek] = tab_operacja[kierunek] * tab_ile[kierunek]/b + a/b ; tab_ile[kierunek] = (tab_ile[i] * (tab_operacja[kierunek]/b) + tab_ile[kierunek] * (a/b)); tab_operacja[kierunek] = nww(tab_operacja[kierunek], a); } } } else{ unsigned long long dl_tym = tab_dl[i]; unsigned long long c = nww(dl_tym, tab_ile[i]); tab_operacja[i] *= c/tab_ile[i]; // tab_ile[i] = c; tab_ile[i] = c/dl_tym; unsigned long long a = tab_operacja[i]; // / dl_tym; for(int j = 0; j < dl_tym; j++){ unsigned long long kierunek = tab_kierunki[i][j] -1; if(tab_operacja[kierunek] == 1){ tab_operacja[kierunek] = a; tab_ile[kierunek] = c/dl_tym; } else{ unsigned long long b = nwd(tab_operacja[kierunek], a); tab_ile[kierunek] = (tab_ile[i] * (tab_operacja[kierunek]/b) + tab_ile[kierunek] * (a/b)); tab_operacja[kierunek] = nww(tab_operacja[kierunek], a); } } } l = nww(l, tab_operacja[i]); } // for(int i = 0; i < n; i++){ // cout << i << " " << tab_operacja[i] << " " << tab_ile[i] << endl; // } cout << l; delete [] tab_ile; for(int i = 0; i < n; i++){ int* ptr = tab_kierunki[i]; delete [] ptr; } delete [] tab_kierunki; delete [] tab_operacja; delete [] tab_dl; return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 | #include <iostream> using namespace std; unsigned long long nwd(unsigned long long a, unsigned long long b){ if(b == 0){ return a; } unsigned long long c = a%b; return nwd(b, c); } unsigned long long nww(unsigned long long a, unsigned long long b){ unsigned long long c = nwd(a, b); unsigned long long d = a * b / c; return d; } int main(){ std::ios_base::sync_with_stdio(false); std::cin.tie(NULL); int n; cin >> n; int *tab_dl = new int [n]; unsigned long long *tab_operacja = new unsigned long long [n]; unsigned long long *tab_ile = new unsigned long long [n]; int **tab_kierunki = new int*[n]; for(int i = 0; i < n; i++){ int tym_dl; cin >> tym_dl; tab_dl[i] = tym_dl; if(tym_dl == 0){ tab_kierunki[i] = new int [1]; tab_kierunki[i] = 0; } else{ tab_kierunki[i] = new int [tym_dl]; } tab_operacja[i] = 1; tab_ile[i] = 1; for(int j = 0; j < tym_dl;j++){ cin >> tab_kierunki[i][j]; } } int koniec = 0; // stan poczatkow, jeśli 0 unsigned long long l = 1; // int a, b; // cin >> a >> b; // cout << nwd(a, b) << endl; for(int i = 0; i < n; i++){ if(tab_dl[i] == 0 ){ continue; } if(i != 0 and tab_operacja[i] == 1){ continue; } if(tab_ile[i] == 1){ unsigned long long dl_tym = tab_dl[i]; tab_operacja[i] *= dl_tym; unsigned long long a = tab_operacja[i]; // unsigned long long a = tab_operacja[i]; for(int j = 0; j < dl_tym; j++){ int kierunek = tab_kierunki[i][j] - 1; if(tab_operacja[kierunek] == 1){ tab_operacja[kierunek] = a; } else{ unsigned long long b = nwd(tab_operacja[kierunek], a); //tab_ile[kierunek] = tab_operacja[kierunek] * tab_ile[kierunek]/b + a/b ; tab_ile[kierunek] = (tab_ile[i] * (tab_operacja[kierunek]/b) + tab_ile[kierunek] * (a/b)); tab_operacja[kierunek] = nww(tab_operacja[kierunek], a); } } } else{ unsigned long long dl_tym = tab_dl[i]; unsigned long long c = nww(dl_tym, tab_ile[i]); tab_operacja[i] *= c/tab_ile[i]; // tab_ile[i] = c; tab_ile[i] = c/dl_tym; unsigned long long a = tab_operacja[i]; // / dl_tym; for(int j = 0; j < dl_tym; j++){ unsigned long long kierunek = tab_kierunki[i][j] -1; if(tab_operacja[kierunek] == 1){ tab_operacja[kierunek] = a; tab_ile[kierunek] = c/dl_tym; } else{ unsigned long long b = nwd(tab_operacja[kierunek], a); tab_ile[kierunek] = (tab_ile[i] * (tab_operacja[kierunek]/b) + tab_ile[kierunek] * (a/b)); tab_operacja[kierunek] = nww(tab_operacja[kierunek], a); } } } l = nww(l, tab_operacja[i]); } // for(int i = 0; i < n; i++){ // cout << i << " " << tab_operacja[i] << " " << tab_ile[i] << endl; // } cout << l; delete [] tab_ile; for(int i = 0; i < n; i++){ int* ptr = tab_kierunki[i]; delete [] ptr; } delete [] tab_kierunki; delete [] tab_operacja; delete [] tab_dl; return 0; } |