-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathukm solution.cpp
More file actions
56 lines (42 loc) · 1.16 KB
/
ukm solution.cpp
File metadata and controls
56 lines (42 loc) · 1.16 KB
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
#include <bits/stdc++.h>
using namespace std;
typedef long long int LL;
pair<LL,LL> egcd(LL a, LL b){ // extended euclidean algorithm to find multiplicative inverse
if (a%b == 0){
return pair<LL,LL>(0, 1);
}
pair<LL,LL> rec = egcd(b, a % b);
pair<LL,LL> ret;
ret.second = rec.first - (a / b) * rec.second;
ret.first = rec.second;
return ret;
}
int main(){
LL n, k, m;
scanf("%lld%lld%lld", &n, &k, &m);
LL ans = 1;
LL kfac = 1;
for (int i = 0; i < k; i++) {
ans = (ans * (n - i)) % m;
}
for (int i = 0; i < k; i++) {
kfac = (kfac * (i + 1)) % m;
}
LL inv = egcd(kfac, m).first;
inv = ((inv % m) + m ) % m;
printf("%lld\n", (ans * inv) % m);
}
/* penjelasan
jumlah cara milih ukm adalah (n)*(n-1)*(n-2)*...*(n-(k-1))
kita misalkan angka ini adalah B
ini bisa dihitung dalam O(k)
jumlah kombinasi pemilihan adalah permutasi dari k alias k!
tanda sama dengan maksudnya kongruen
maka jawaban adalah: ans * (k!) = B
tapi gaboleh sembarangan bagi klo bermain dalam modular arithmetic
untungnya soal menjamin bahwa gcd(k!, m) == 1
maka kita bisa cari multiplicative inverse
agar ans * (k!) = B
menjadi ans * (k!) * inv = B * inv
menjadi ans = B * inv
*/