main.go 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. package main
  2. import (
  3. "bufio"
  4. "fmt"
  5. "os"
  6. )
  7. func numberSets(scanner *bufio.Scanner) []int64 {
  8. caseCnt := ReadInt(scanner)
  9. params := make([][]int64, caseCnt)
  10. var nMax int64
  11. for i := 0; i < caseCnt; i++ {
  12. params[i] = ReadInt64s(scanner)
  13. if params[i][1]-params[i][0]+1 > nMax {
  14. nMax = params[i][1] - params[i][0] + 1
  15. }
  16. }
  17. sieve := make([]bool, nMax+1)
  18. prime := make([]int64, 0)
  19. for i := int64(2); i <= nMax; i++ {
  20. if !sieve[i] {
  21. prime = append(prime, i)
  22. for j := i * i; j <= nMax; j += i {
  23. sieve[j] = true
  24. }
  25. }
  26. } // Find all prime numbers between 1 and nMax
  27. answer := make([]int64, caseCnt)
  28. for i := range params {
  29. println("Case", i+1) // Too slow
  30. A, B, P := params[i][0], params[i][1], params[i][2]
  31. uf := NewUF(B - A + 1)
  32. for _, p := range prime {
  33. if p < P {
  34. continue
  35. } else if p > B-A {
  36. break
  37. }
  38. beg := ((A + (p - 1)) / p) * p
  39. for n := beg; n <= B; n += p {
  40. uf.Union(beg-A, n-A)
  41. }
  42. }
  43. answer[i] = uf.Cnt
  44. }
  45. return answer
  46. }
  47. func main() {
  48. inputFiles := []string{"B-small-practice.in", "B-large-practice.in", "test.in"}
  49. outputFiles := []string{"result-small.out", "result-large.out", "test.out"}
  50. const (
  51. small = iota
  52. large
  53. test
  54. )
  55. fileType := large
  56. fin, _ := os.Open(inputFiles[fileType])
  57. defer fin.Close()
  58. scanner := bufio.NewScanner(fin)
  59. answer := numberSets(scanner)
  60. fout, _ := os.Create(outputFiles[fileType])
  61. defer fout.Close()
  62. for i, v := range answer {
  63. s := fmt.Sprintf("Case #%d: %d\n", i+1, v)
  64. fout.WriteString(s)
  65. }
  66. }