1
+ // TLE
2
+ class Solution {
3
+ const static int MOD = 1000000007 ;
4
+ vector<int > fact;
5
+ vector<int > ifact;
6
+
7
+ int power (int base, int exp, int mod) {
8
+ if (exp == 0 ) return 1 ;
9
+ int ret = power (base, exp / 2 , mod) % mod;
10
+ ret = 1LL * ret * ret % mod;
11
+ if (exp & 1 ) {
12
+ ret = 1LL * ret * base % mod;
13
+ }
14
+ return ret;
15
+ }
16
+
17
+ int modInv (int base, int mod = MOD) {
18
+ return power (base, mod - 2 , mod);
19
+ }
20
+
21
+ void init (int n) {
22
+ fact = vector<int >(n + 1 , 0 );
23
+ ifact = vector<int >(n + 1 , 0 );
24
+ fact[0 ] = ifact[0 ] = 1 ;
25
+ for (int i = 1 ; i <= n; i++) {
26
+ fact[i] = 1LL * i * fact[i - 1 ] % MOD;
27
+ ifact[i] = modInv (fact[i]);
28
+ }
29
+ }
30
+
31
+ int nCr (int n, int r) {
32
+ if (r > n) return 0 ;
33
+ int ans = fact[n];
34
+ ans = 1LL * ans * ifact[r] % MOD;
35
+ ans = 1LL * ans * ifact[n - r] % MOD;
36
+ return ans;
37
+ }
38
+ public:
39
+ int checkRecord (int n) {
40
+ init (n + 1 );
41
+ int maxLate = n - (n / 3 );
42
+ int result = 0 ;
43
+ for (int i = 0 ; i <= maxLate; i++) {
44
+ int ways = 0 ;
45
+ for (int k = (i / 2 ) + (i % 2 ), pair = i / 2 ; k <= i; k++, pair--) {
46
+ ways = (ways + (1LL * nCr (n - i + 1 , k) * nCr (k, pair)) % MOD) % MOD;
47
+ }
48
+ result = (result + ways) % MOD;
49
+ result = (result + (1LL * ways * (n - i) % MOD)) % MOD;
50
+ }
51
+ return result;
52
+ }
53
+ };
54
+
55
+ // MLE
56
+ class Solution {
57
+ #define MOD 1000000007
58
+ vector<vector<vector<int >>> dp;
59
+ int n;
60
+
61
+ int solve (int i, int k, int taken) {
62
+ if (i == n) {
63
+ return (k == 0 );
64
+ }
65
+ if (dp[i][k][taken] != -1 ) {
66
+ return dp[i][k][taken];
67
+ }
68
+ if (taken == 2 ) {
69
+ return dp[i][k][taken] = solve (i + 1 , k, 0 ) % MOD;
70
+ }
71
+
72
+ return dp[i][k][taken] = (solve (i + 1 , k, 0 ) + (k > 0 ? solve (i + 1 , k - 1 , taken + 1 ) : 0 )) % MOD;
73
+ }
74
+
75
+ public:
76
+ int checkRecord (int n) {
77
+ this ->n = n;
78
+ int maxLate = n - (n / 3 );
79
+ dp= vector<vector<vector<int >>>(n, vector<vector<int >>(maxLate + 1 , vector<int >(3 , -1 )));
80
+ int result = 0 ;
81
+ for (int i = 0 ; i <= maxLate; i++) {
82
+ int cnt = solve (0 , i, 0 );
83
+ result = (result + cnt) % MOD;
84
+ result = (result + (1LL * cnt * (n - i) % MOD)) % MOD;
85
+ }
86
+ return result;
87
+ }
88
+ };
0 commit comments