1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 |
- package main
- import (
- "bufio"
- "fmt"
- "os"
- )
- func numberSets(scanner *bufio.Scanner) []int64 {
- caseCnt := ReadInt(scanner)
- params := make([][]int64, caseCnt)
- var nMax int64
- for i := 0; i < caseCnt; i++ {
- params[i] = ReadInt64s(scanner)
- if params[i][1]-params[i][0]+1 > nMax {
- nMax = params[i][1] - params[i][0] + 1
- }
- }
- sieve := make([]bool, nMax+1)
- prime := make([]int64, 0)
- for i := int64(2); i <= nMax; i++ {
- if !sieve[i] {
- prime = append(prime, i)
- for j := i * i; j <= nMax; j += i {
- sieve[j] = true
- }
- }
- } // Find all prime numbers between 1 and nMax
- answer := make([]int64, caseCnt)
- for i := range params {
- println("Case", i+1) // Too slow
- A, B, P := params[i][0], params[i][1], params[i][2]
- uf := NewUF(B - A + 1)
- for _, p := range prime {
- if p < P {
- continue
- } else if p > B-A {
- break
- }
- beg := ((A + (p - 1)) / p) * p
- for n := beg; n <= B; n += p {
- uf.Union(beg-A, n-A)
- }
- }
- answer[i] = uf.Cnt
- }
- return answer
- }
- func main() {
- inputFiles := []string{"B-small-practice.in", "B-large-practice.in", "test.in"}
- outputFiles := []string{"result-small.out", "result-large.out", "test.out"}
- const (
- small = iota
- large
- test
- )
- fileType := large
- fin, _ := os.Open(inputFiles[fileType])
- defer fin.Close()
- scanner := bufio.NewScanner(fin)
- answer := numberSets(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)
- }
- }
|