main.go 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. package main
  2. import (
  3. "bufio"
  4. "fmt"
  5. "os"
  6. )
  7. func generateData(p []int64) []Pair64 {
  8. n, A, B, C, D, x0, y0, M := p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7]
  9. result := make([]Pair64, n)
  10. result[0] = Pair64{x0, y0}
  11. for i := 1; int64(i) < n; i++ {
  12. result[i]._1 = (A*result[i-1]._1 + B) % M
  13. result[i]._2 = (C*result[i-1]._2 + D) % M
  14. }
  15. return result
  16. }
  17. func cropTriangle(scanner *bufio.Scanner) []int {
  18. caseCnt := ReadInt(scanner)
  19. answer := make([]int, caseCnt)
  20. for i := 0; i < caseCnt; i++ {
  21. params := ReadInt64s(scanner)
  22. pts := generateData(params)
  23. bucket := make([]int, 9)
  24. for _, p := range pts {
  25. x, y := p._1%3, p._2%3
  26. bucket[y*3+x]++
  27. }
  28. // 3 cases: 3 points in same class;
  29. // 2 same, 1 diffrent (impossible); 3 diffrent.
  30. for j := 0; j < 9; j++ {
  31. answer[i] += bucket[j] * (bucket[j] - 1) * (bucket[j] - 2) / 6
  32. }
  33. for j := 0; j < 9; j++ {
  34. for k := j + 1; k < 9; k++ {
  35. for l := k + 1; l < 9; l++ {
  36. if (j/3+k/3+l/3)%3 == 0 && (j%3+k%3+l%3)%3 == 0 {
  37. answer[i] += bucket[j] * bucket[k] * bucket[l]
  38. }
  39. }
  40. }
  41. }
  42. }
  43. return answer
  44. }
  45. func main() {
  46. inputFiles := []string{"A-small-practice.in", "A-large-practice.in", "test.in"}
  47. outputFiles := []string{"result-small.out", "result-large.out", "test.out"}
  48. const (
  49. small = iota
  50. large
  51. test
  52. )
  53. fileType := test
  54. fin, _ := os.Open(inputFiles[fileType])
  55. defer fin.Close()
  56. scanner := bufio.NewScanner(fin)
  57. answer := cropTriangle(scanner)
  58. fout, _ := os.Create(outputFiles[fileType])
  59. defer fout.Close()
  60. for i, v := range answer {
  61. s := fmt.Sprintf("Case #%d: %d\n", i+1, v)
  62. fout.WriteString(s)
  63. }
  64. }