|
@@ -0,0 +1,73 @@
|
|
|
+package main
|
|
|
+
|
|
|
+import (
|
|
|
+ "bufio"
|
|
|
+ "fmt"
|
|
|
+ "os"
|
|
|
+)
|
|
|
+
|
|
|
+func generateData(p []int64) []Pair64 {
|
|
|
+ n, A, B, C, D, x0, y0, M := p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7]
|
|
|
+ result := make([]Pair64, n)
|
|
|
+ result[0] = Pair64{x0, y0}
|
|
|
+ for i := 1; int64(i) < n; i++ {
|
|
|
+ result[i]._1 = (A*result[i-1]._1 + B) % M
|
|
|
+ result[i]._2 = (C*result[i-1]._2 + D) % M
|
|
|
+ }
|
|
|
+ return result
|
|
|
+}
|
|
|
+
|
|
|
+func cropTriangle(scanner *bufio.Scanner) []int {
|
|
|
+ caseCnt := ReadInt(scanner)
|
|
|
+ answer := make([]int, caseCnt)
|
|
|
+ for i := 0; i < caseCnt; i++ {
|
|
|
+ params := ReadInt64s(scanner)
|
|
|
+ pts := generateData(params)
|
|
|
+ bucket := make([]int, 9)
|
|
|
+ for _, p := range pts {
|
|
|
+ x, y := p._1%3, p._2%3
|
|
|
+ bucket[y*3+x]++
|
|
|
+ }
|
|
|
+ // 3 cases: 3 points in same class;
|
|
|
+ // 2 same, 1 diffrent (impossible); 3 diffrent.
|
|
|
+ for j := 0; j < 9; j++ {
|
|
|
+ answer[i] += bucket[j] * (bucket[j] - 1) * (bucket[j] - 2) / 6
|
|
|
+ }
|
|
|
+ for j := 0; j < 9; j++ {
|
|
|
+ for k := j + 1; k < 9; k++ {
|
|
|
+ for l := k + 1; l < 9; l++ {
|
|
|
+ if (j/3+k/3+l/3)%3 == 0 && (j%3+k%3+l%3)%3 == 0 {
|
|
|
+ answer[i] += bucket[j] * bucket[k] * bucket[l]
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return answer
|
|
|
+}
|
|
|
+
|
|
|
+func main() {
|
|
|
+ inputFiles := []string{"A-small-practice.in", "A-large-practice.in", "test.in"}
|
|
|
+ outputFiles := []string{"result-small.out", "result-large.out", "test.out"}
|
|
|
+ const (
|
|
|
+ small = iota
|
|
|
+ large
|
|
|
+ test
|
|
|
+ )
|
|
|
+
|
|
|
+ fileType := test
|
|
|
+
|
|
|
+ fin, _ := os.Open(inputFiles[fileType])
|
|
|
+ defer fin.Close()
|
|
|
+
|
|
|
+ scanner := bufio.NewScanner(fin)
|
|
|
+ answer := cropTriangle(scanner)
|
|
|
+
|
|
|
+ fout, _ := os.Create(outputFiles[fileType])
|
|
|
+ defer fout.Close()
|
|
|
+
|
|
|
+ for i, v := range answer {
|
|
|
+ s := fmt.Sprintf("Case #%d: %d\n", i+1, v)
|
|
|
+ fout.WriteString(s)
|
|
|
+ }
|
|
|
+}
|