-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCombination.cpp
More file actions
98 lines (91 loc) · 2.56 KB
/
Combination.cpp
File metadata and controls
98 lines (91 loc) · 2.56 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
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
#include <cstdio>
#include <cassert>
using namespace std;
#define unittest_name_helper(counter) unittest_ ## counter
#define unittest_name(counter) unittest_name_helper(counter)
#define unittest __attribute__((constructor)) void unittest_name(__COUNTER__) ()
const int MOD = 1e9 + 7;
const int N = 5000001;
long long fact[N];
long long invfact[N];
long long inv[N];
void init() {
fact[0] = fact[1] = 1;
for (int i = 2; i < N; i ++) fact[i] = fact[i - 1] * i % MOD;
inv[1] = 1;
for (int i = 2; i < N; i ++) inv[i] = (MOD - MOD / i) * inv[MOD % i] % MOD;
invfact[0] = invfact[1] = 1;
for (int i = 2; i < N; i ++) invfact[i] = invfact[i - 1] * inv[i] % MOD;
}
long long C(long long n, long long r) {
if (n < 0 || r < 0 || n < r) return 0;
return fact[n] * invfact[n - r] % MOD * invfact[r] % MOD;
}
unittest {
init();
assert(fact[10] == 3628800);
assert(fact[123456] == 639390503);
assert(invfact[10] == 283194722);
assert(invfact[10000] == 556156297);
assert(C(10, 3) == 120);
assert(C(432944, 9324) == 411155797);
}
//long long Inv(long long a) {
// long long res = 1;
// long long n = MOD - 2;
// while (n > 0) {
// if (n & 1) res = res * a % MOD;
// a = a * a % MOD;
// n >>= 1;
// }
// return res;
//}
/*
unittest {
assert(Inv(1) == 1);
assert(Inv(2) == 500000004);
assert(Inv(55) == 763636369);
assert(Inv(123456789) == 18633540);
}
*/
//O(r log r)
//long long C(long long n, long long r) {
// if (n < r) return 0;
// if (n - r < r) r = n - r;
// long long ret = 1;
// for (int i = 0; i < r; i ++) {
// ret = ret * (n % MOD) % MOD;
// n --;
// ret = ret * Inv(i + 1) % MOD;
// }
// return ret;
//}
/*
unittest {
assert(C(10, 3) == 120);
assert(C(432944, 9324) == 411155797);
}
*/
//modとらないC
//const int N = 61;
//long long com[N][N];
//void init() {
// for (int i = 0; i <= N - 1; i ++) {
// for (int j = 0; j <= i; j ++) {
// if (j == 0 || j == i) com[i][j] = 1LL;
// else com[i][j] = com[i - 1][j - 1] + com[i - 1][j];
// }
// }
//}
//long long C(int n, int r) { return com[n][r]; }
/*
unittest {
init();
assert(C(10, 3) == 120);
assert(C(45, 33) == 28760021745);
assert(C(60, 29) == 114449595062769120);
}
*/
int main() {
return 0;
}