|
@@ -6,10 +6,53 @@ import (
|
|
|
"os"
|
|
|
)
|
|
|
|
|
|
+// MOD ...
|
|
|
+const MOD = 1000000007
|
|
|
+
|
|
|
func countIncreasing(scanner *bufio.Scanner) []int {
|
|
|
caseCnt := ReadInt(scanner)
|
|
|
answer := make([]int, caseCnt)
|
|
|
for cid := 0; cid < caseCnt; cid++ {
|
|
|
+ println("Case", cid+1, "/", caseCnt)
|
|
|
+ params := ReadInts(scanner)
|
|
|
+ n, m, X, Y, Z := params[0], params[1], params[2], params[3], params[4]
|
|
|
+ A := make([]int, m)
|
|
|
+ limits := make([]int, n)
|
|
|
+ for i := 0; i < n; i++ {
|
|
|
+ if i < m {
|
|
|
+ A[i] = ReadInt(scanner)
|
|
|
+ }
|
|
|
+ limits[i] = A[i%m]
|
|
|
+ A[i%m] = (X*A[i%m] + Y*(i+1)) % Z
|
|
|
+ } // To generate input array 'limits'
|
|
|
+ st := NewSegmentTree(limits)
|
|
|
+ dp := make([]int, n+1)
|
|
|
+ dp[0] = 1
|
|
|
+ for i := 1; i <= n; i++ {
|
|
|
+ dp[i]++
|
|
|
+ // *********************************
|
|
|
+ // * Segment tree solution *
|
|
|
+ // *********************************
|
|
|
+ for j := st.NextGreater(limits[i-1], i) + 1; j != 0; j = st.NextGreater(limits[i-1], j) + 1 {
|
|
|
+ dp[j] += dp[i]
|
|
|
+ dp[j] %= MOD
|
|
|
+ }
|
|
|
+ // *********************************
|
|
|
+ // * Original solution *
|
|
|
+ // *********************************
|
|
|
+ // for j := i + 1; j <= n; j++ { // It is too slow to search between i+1 and n for big case
|
|
|
+ // if limits[i-1] < limits[j-1] {
|
|
|
+ // dp[j] += dp[i]
|
|
|
+ // dp[j] %= MOD
|
|
|
+ // }
|
|
|
+ // }
|
|
|
+ // *********************************
|
|
|
+ // Both are to slow for solving the big problem set.
|
|
|
+ }
|
|
|
+ for i := 1; i <= n; i++ {
|
|
|
+ answer[cid] += dp[i]
|
|
|
+ }
|
|
|
+ answer[cid] %= MOD
|
|
|
}
|
|
|
return answer
|
|
|
}
|
|
@@ -23,7 +66,7 @@ func main() {
|
|
|
test
|
|
|
)
|
|
|
|
|
|
- fileType := test
|
|
|
+ fileType := small
|
|
|
|
|
|
fin, _ := os.Open(inputFiles[fileType])
|
|
|
defer fin.Close()
|