// PR Bab 16, tantangan -- pembahasan. // // Rumus tujuh suku: // n/p + n/q + n/r // - n/kpk(p,q) - n/kpk(p,r) - n/kpk(q,r) // + n/kpk(p,q,r) #include using namespace std; long long fpb(long long a, long long b) { while (b != 0) { long long sisa = a % b; a = b; b = sisa; } return a; } // KPK yang berhenti di BESAR kalau hasilnya melampaui n, supaya tidak meluap long long kpk_terbatas(long long a, long long b, long long batas) { long long g = fpb(a, b); long long calon = a / g; if (calon > batas / b) return batas + 1; return calon * b; } int main() { long long n, p, q, r; cin >> n >> p >> q >> r; long long pq = kpk_terbatas(p, q, n); long long pr = kpk_terbatas(p, r, n); long long qr = kpk_terbatas(q, r, n); long long pqr = kpk_terbatas(pq > n ? n + 1 : pq, r, n); long long jawab = n / p + n / q + n / r; if (pq <= n) jawab -= n / pq; if (pr <= n) jawab -= n / pr; if (qr <= n) jawab -= n / qr; if (pqr <= n) jawab += n / pqr; cout << jawab << "\n"; // Pemeriksaan dengan pencacahan langsung untuk n kecil. if (n <= 10000) { long long cacah = 0; for (long long i = 1; i <= n; i++) if (i % p == 0 || i % q == 0 || i % r == 0) cacah++; cout << "cacah langsung: " << cacah << "\n"; } return 0; }