main.go 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. package main
  2. import (
  3. "bufio"
  4. "fmt"
  5. "math"
  6. "os"
  7. )
  8. func numberSets(scanner *bufio.Scanner) []int64 {
  9. caseCnt := ReadInt(scanner)
  10. answer := make([]int64, caseCnt)
  11. params := make([][]int64, caseCnt)
  12. for i := 0; i < caseCnt; i++ {
  13. params[i] = ReadInt64s(scanner)
  14. }
  15. for i := range params {
  16. A, B, P := params[i][0], params[i][1], params[i][2]
  17. n := B - A + 1
  18. uf := NewUF(n + 1)
  19. composite := make(map[int64]bool)
  20. sqrtN := int64(math.Sqrt(float64(n)))
  21. for j := int64(2); j <= sqrtN; j++ {
  22. if !composite[j] {
  23. for k := j; j*k <= n; k++ {
  24. composite[j*k] = true
  25. if j >= P || k >= P {
  26. uf.Union(j*k, j)
  27. } else {
  28. uf.Union(j, 2)
  29. }
  30. }
  31. }
  32. }
  33. answer[i] = uf.Cnt - 1
  34. }
  35. return answer
  36. }
  37. func main() {
  38. inputFiles := []string{"B-small-practice.in", "B-large-practice.in", "test.in"}
  39. outputFiles := []string{"result-small.out", "result-large.out", "test.out"}
  40. const (
  41. small = iota
  42. large
  43. test
  44. )
  45. fileType := test
  46. fin, _ := os.Open(inputFiles[fileType])
  47. defer fin.Close()
  48. scanner := bufio.NewScanner(fin)
  49. answer := numberSets(scanner)
  50. fout, _ := os.Create(outputFiles[fileType])
  51. defer fout.Close()
  52. for i, v := range answer {
  53. s := fmt.Sprintf("Case #%d: %d\n", i+1, v)
  54. fout.WriteString(s)
  55. }
  56. }