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) } }