@@ -9,12 +9,12 @@ import "sort"
9
9
// 我的题解 https://www.luogu.com.cn/blog/endlesscheng/solution-cf896c
10
10
type odtBlock struct {
11
11
l , r int
12
- val int64
12
+ val int
13
13
}
14
14
15
15
type odt []odtBlock
16
16
17
- func newODT (arr []int64 ) odt {
17
+ func newODT (arr []int ) odt {
18
18
n := len (arr )
19
19
t := make (odt , n )
20
20
for i := range t {
@@ -49,7 +49,7 @@ func (t *odt) prepare(l, r int) (begin, end int) {
49
49
50
50
// 以下方法传入的 begin, end 来自事先计算的 t.prepare
51
51
52
- func (t * odt ) merge (begin , end , r int , val int64 ) {
52
+ func (t * odt ) merge (begin , end , r , val int ) {
53
53
ot := * t
54
54
ot [begin ].r = r
55
55
ot [begin ].val = val
@@ -58,13 +58,13 @@ func (t *odt) merge(begin, end, r int, val int64) {
58
58
}
59
59
}
60
60
61
- func (t odt ) add (begin , end int , val int64 ) {
61
+ func (t odt ) add (begin , end , val int ) {
62
62
for i := begin ; i < end ; i ++ {
63
63
t [i ].val += val
64
64
}
65
65
}
66
66
67
- func (t odt ) kth (begin , end , k int ) int64 {
67
+ func (t odt ) kth (begin , end , k int ) int {
68
68
blocks := append (odt (nil ), t [begin :end ]... )
69
69
sort .Slice (blocks , func (i , j int ) bool { return blocks [i ].val < blocks [j ].val })
70
70
k --
@@ -78,22 +78,10 @@ func (t odt) kth(begin, end, k int) int64 {
78
78
panic (k )
79
79
}
80
80
81
- func (odt ) pow (x int64 , n int , mod int64 ) int64 {
82
- x %= mod
83
- res := int64 (1 ) % mod
84
- for ; n > 0 ; n >>= 1 {
85
- if n & 1 == 1 {
86
- res = res * x % mod
87
- }
88
- x = x * x % mod
89
- }
90
- return res
91
- }
92
-
93
- func (t odt ) powSum (begin , end int , n int , mod int64 ) (res int64 ) {
81
+ func (t odt ) powSum (begin , end int , n int ) (res int ) {
94
82
for _ , b := range t [begin :end ] {
95
83
// 总和能溢出的话这里要额外取模
96
- res += int64 (b .r - b .l + 1 ) * t . pow (b .val , n , mod )
84
+ res += (b .r - b .l + 1 ) * pow (b .val , n )
97
85
}
98
86
return res % mod
99
87
}
0 commit comments