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