// Contoh Bab 17: tiga cara menghitung C(n, r) mod p -- dua benar, satu salah. // // Compile: g++ -std=c++17 -O2 -o kombinasimod exercises/17/03-kombinasi-mod.cpp // Jalankan: ./kombinasimod // Contoh masukan: 30 15 #include using namespace std; const long long MOD = 1000000007; const int MAKS = 1000005; long long fakt[MAKS]; long long C[1005][1005]; 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; } int main() { int n, r; cin >> n >> r; // Cara 1: segitiga Pascal (tanpa pembagian sama sekali). for (int i = 0; i <= n; i++) { C[i][0] = 1; for (int j = 1; j <= i; j++) C[i][j] = (C[i - 1][j - 1] + C[i - 1][j]) % MOD; } // Cara 2: faktorial dan invers modulo. fakt[0] = 1; for (int i = 1; i <= n; i++) fakt[i] = fakt[i - 1] * i % MOD; long long bawah = fakt[r] * fakt[n - r] % MOD; long long cara2 = fakt[n] * pangkat_mod(bawah, MOD - 2, MOD) % MOD; // Cara 3: pembagian bulat biasa sesudah modulo -- SALAH. long long cara3 = fakt[n] / bawah; cout << "pascal : " << C[n][r] << "\n"; cout << "faktorial + invers: " << cara2 << "\n"; cout << "pembagian biasa : " << cara3 << " (salah)\n"; return 0; }