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