// Mini-proyek Bagian 4: Kalkulator Teori Bilangan -- versi selesai. // // Uji prima memakai daftar bilangan prima hasil saringan sampai 10^6, // sehingga satu pertanyaan jenis 4 hanya memerlukan sekitar 78.498 // pembagian, bukan 10^6. // // Compile: g++ -std=c++17 -O2 -o kalkulator projects/04-kalkulator-bilangan/finished.cpp // Jalankan: ./kalkulator < projects/04-kalkulator-bilangan/contoh-masukan.txt #include #include using namespace std; const int BATAS = 1000001; bool coret[BATAS]; vector daftar_prima; void saring() { coret[0] = coret[1] = true; for (int i = 2; (long long)i * i < BATAS; i++) if (!coret[i]) for (int j = i * i; j < BATAS; j += i) coret[j] = true; for (int i = 2; i < BATAS; i++) if (!coret[i]) daftar_prima.push_back(i); } long long fpb(long long a, long long b) { while (b != 0) { long long sisa = a % b; a = b; b = sisa; } return a; } long long kpk(long long a, long long b) { return a / fpb(a, b) * b; } long long pangkat_mod(long long a, long long b, long long m) { long long hasil = 1; a %= m; while (b > 0) { if (b % 2 == 1) hasil = hasil * a % m; a = a * a % m; b /= 2; } return hasil; } bool prima(long long n) { if (n < 2) return false; for (int p : daftar_prima) { if ((long long)p * p > n) break; if (n % p == 0) return false; } return true; } long long invers(long long y, long long p) { return pangkat_mod(y % p, p - 2, p); } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); saring(); int q; cin >> q; while (q--) { int jenis; cin >> jenis; if (jenis == 1) { long long a, b; cin >> a >> b; cout << fpb(a, b) << "\n"; } else if (jenis == 2) { long long a, b; cin >> a >> b; cout << kpk(a, b) << "\n"; } else if (jenis == 3) { long long a, b, m; cin >> a >> b >> m; cout << pangkat_mod(a, b, m) << "\n"; } else if (jenis == 4) { long long n; cin >> n; cout << (prima(n) ? "PRIMA" : "BUKAN") << "\n"; } else if (jenis == 5) { long long p, r; cin >> p >> r; long long g = fpb(p, r); cout << p / g << "/" << r / g << "\n"; } else { long long x, y, p; cin >> x >> y >> p; cout << x % p * invers(y, p) % p << "\n"; } } return 0; }