xxx
package com.sensetime.iag.v2x.device.mec.init
/**
* 示例 1:
*
* 输入:n = 2, rollMax = [1,1,2,2,2,3]
* 输出:34
* 解释:我们掷 2 次骰子,如果没有约束的话,共有 6 * 6 = 36 种可能的组合。但是根据 rollMax 数组,数字 1 和 2 最多连续出现一次,所以不会出现序列 (1,1) 和 (2,2)。因此,最终答案是 36-2 = 34。
* 示例 2:
*
* 输入:n = 2, rollMax = [1,1,1,1,1,1]
* 输出:30
* 示例 3:
*
* n = 3
* 11x, x11
* 6
* 5
*
* 输入:n = 4, rollMax = [1,1,1,2,2,3] = 1296
* 11xx,x11x,xx11
* 36 25 25
* 22xx,x22x,xx22
* 6*6 , 5*5 +5 , 5*5
* 36 26 26
*
* 6*6 36+25+25 86*3 =258 22 280
* 5*5 11*2
* 5*5 1
*
* x444 6
* 444x 5
*
* 11
* 11
* 6666
*
* x444x
*
* n =5
* 11xxx, x11xx,xx11x,xxx11
* 6*6*6
* 5*5*5
* 5*5*5
* 5*5*5
*
* 22x,x22,33x,x33,444,555
*/
class Solution {
fun dieSimulator(n: Int, rollMax: IntArray): Int {
val all = Math.pow(6.0, n.toDouble()).toLong()
val modVal = Math.pow(10.0, 9.0) + 7
// n = 3, (1,1,x) x11, 22x x22 , 33x x33, 444,555
// n = 4, 11xx,x11x,xx11, 22xx,x22x,xx22,
// n = 5, 11xxx, x11xx, xx11x, xxx11
var remove = 0L;
for ((i, it) in rollMax.withIndex()) {
val j = i + 1
if (it >= n) {
continue
}
if (it == n - 1) {
remove += 1
continue
}
for (k in 0..n - it - 1) {
val p = if (k == 0) 6 else 5
val r2 = Math.pow(p.toDouble(), (n - it - 1).toDouble()).toLong()
remove += r2
}
}
return if ((all - remove) < Int.MAX_VALUE) (all - remove).toInt() else ((all - remove) % modVal).toInt()
}
}
fun main() {
println(Solution().dieSimulator(4, arrayOf(1, 1, 1, 2, 2, 3).toIntArray()))
}
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
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
Last Updated: 2023/02/10, 17:02:00