dengxinyi 6 yıl önce
ebeveyn
işleme
96c2aac10a

+ 100 - 0
2008/1B/B/B-large-practice.in

@@ -0,0 +1,100 @@
+99
+104365208989 104365835084 6
+206822137620 206823061341 6
+527342392758 527343191148 6
+10 20 5
+640664958341 640665958341 552301
+502771948608 502772724890 2
+23855656074 23856621666 3
+807451002671 807451862760 9
+321833351880 321834191688 4
+774400955878 774401825460 278190
+574645583429 574646560895 394315
+886454347598 886455315147 6
+788821319895 788822136136 551158
+184528795505 184529792323 431769
+701656222539 701656941059 6
+190533110694 190534097381 5
+845145070921 845145815135 4
+538527249075 538528248034 9
+670285762738 670286205409 7
+136543463842 136544444070 812398
+758341507360 758342424203 4
+56627459783 56628319437 10770
+944735347891 944736157504 4
+811031347156 811032069991 9
+685013630741 685014529753 961357
+201010392657 201011271908 7
+578165315458 578166236221 4
+482636701496 482637538288 789145
+838165139288 838166123149 7
+437644321431 437644899932 394332
+449682471889 449683347201 997609
+833197330950 833198263135 630259
+530005582776 530006551492 831936
+443494211391 443495204304 5
+12661086868 12661738982 6
+936890525338 936891512478 5
+999999000000 1000000000000 1000000
+206487816351 206488571969 5
+136659854097 136660729935 432838
+80168587895 80169440708 398051
+717266554850 717267309230 5
+38017281985 38017583240 6
+126866133173 126867065547 840018
+35358 35358 35358
+743526520981 743527178765 9
+146893663174 146894544453 862114
+776003566109 776004551832 8
+664659720418 664660609101 8
+368163457761 368164224898 6
+452723989502 452724940818 805144
+133664846589 133665794066 5
+865034490643 865035194046 8
+26395838602 26396703245 3
+1 1000000 999999
+192100 192101 2
+329990787132 329991728115 3
+664745427052 664746323050 6
+1 1000000 127
+709247365709 709248330914 9
+119723 119723 2
+125976515925 125977499963 3
+411779106591 411779810499 5
+999999000000 1000000000000 126
+869113197456 869113849123 3
+240302764751 240303638361 356312
+747377 747378 2
+876765 876765 2
+135031051975 135031809153 6
+2 10937 10937
+361692753547 361693612648 106385
+859078132575 859079018140 928031
+999999000000 1000000000000 2
+786749817340 786750673562 49700
+10585884160 10586875158 4
+229112605960 229113542676 2
+951458404619 951459360369 2
+137318811686 137319763214 575581
+412622898361 412623331180 8
+1 1000000 2
+556430191845 556431116261 122846
+494578915950 494579822896 6
+32890327876 32891008684 5
+72573253344 72573890958 4
+415123411536 415124291894 3
+64997530349 64998453080 487716
+529282140283 529282863356 5
+796207125487 796207847668 2
+145353750346 145354747006 947123
+659460941350 659461941186 2
+510642703264 510643670870 974562
+97309080736 97310059743 512823
+960785023882 960785835931 8
+28592384025 28593054056 7
+691242939764 691243492380 4
+392899062085 392900044356 6
+135015293740 135016104418 9
+10 20 3
+444771017660 444772008966 9
+1 1000000 1000000

+ 10 - 0
2008/1B/B/B-small-practice.in

@@ -0,0 +1,10 @@
+9
+365 952 5
+330 990 502
+10 20 5
+765 993 4
+591 1000 428
+1 1000 2
+464 1000 4
+10 20 3
+61 994 8

+ 64 - 0
2008/1B/B/main.go

@@ -0,0 +1,64 @@
+package main
+
+import (
+	"bufio"
+	"fmt"
+	"math"
+	"os"
+)
+
+func numberSets(scanner *bufio.Scanner) []int64 {
+	caseCnt := ReadInt(scanner)
+	answer := make([]int64, caseCnt)
+	params := make([][]int64, caseCnt)
+	for i := 0; i < caseCnt; i++ {
+		params[i] = ReadInt64s(scanner)
+	}
+	for i := range params {
+		A, B, P := params[i][0], params[i][1], params[i][2]
+		n := B - A + 1
+		uf := NewUF(n + 1)
+		composite := make(map[int64]bool)
+		sqrtN := int64(math.Sqrt(float64(n)))
+		for j := int64(2); j <= sqrtN; j++ {
+			if !composite[j] {
+				for k := j; j*k <= n; k++ {
+					composite[j*k] = true
+					if j >= P || k >= P {
+						uf.Union(j*k, j)
+					} else {
+						uf.Union(j, 2)
+					}
+				}
+			}
+		}
+		answer[i] = uf.Cnt - 1
+	}
+	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 := test
+
+	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)
+	}
+}

+ 9 - 0
2008/1B/B/result-small.out

@@ -0,0 +1,9 @@
+Case #1: 104
+Case #2: 653
+Case #3: 9
+Case #4: 49
+Case #5: 403
+Case #6: 159
+Case #7: 96
+Case #8: 7
+Case #9: 162

+ 3 - 0
2008/1B/B/test.in

@@ -0,0 +1,3 @@
+2
+10 20 5
+10 20 3

+ 2 - 0
2008/1B/B/test.out

@@ -0,0 +1,2 @@
+Case #1: 9
+Case #2: 7

+ 44 - 0
2008/1B/B/uf.go

@@ -0,0 +1,44 @@
+package main
+
+// UnionFind ...
+type UnionFind struct {
+	Cnt  int64
+	ID   []int64
+	Size []int64
+}
+
+// NewUF ...
+func NewUF(size int64) UnionFind {
+	var uf UnionFind
+	uf.Cnt = size
+	uf.ID = make([]int64, size)
+	for i := int64(0); i < size; i++ {
+		uf.ID[i] = i
+	}
+	uf.Size = make([]int64, size)
+	return uf
+}
+
+// Union ...
+func (uf *UnionFind) Union(p, q int64) {
+	pID, qID := uf.Find(p), uf.Find(q)
+	if pID == qID {
+		return
+	}
+	if uf.Size[pID] < uf.Size[qID] {
+		uf.ID[pID] = qID
+		uf.Size[qID] += uf.Size[pID]
+	} else {
+		uf.ID[qID] = pID
+		uf.Size[pID] += uf.Size[qID]
+	}
+	uf.Cnt--
+}
+
+// Find ...
+func (uf *UnionFind) Find(id int64) int64 {
+	for id != uf.ID[id] {
+		id = uf.ID[id]
+	}
+	return id
+}

+ 57 - 0
2008/1B/B/utils.go

@@ -0,0 +1,57 @@
+package main
+
+import (
+	"bufio"
+	"strconv"
+	"strings"
+)
+
+// Pair ...
+type Pair struct {
+	_1 int
+	_2 int
+}
+
+// Pair64 ...
+type Pair64 struct {
+	_1 int64
+	_2 int64
+}
+
+// ReadInt ...
+func ReadInt(s *bufio.Scanner) int {
+	s.Scan()
+	i, _ := strconv.ParseInt(s.Text(), 10, 32)
+	return int(i)
+}
+
+// ReadInt64 ...
+func ReadInt64(s *bufio.Scanner) int64 {
+	s.Scan()
+	i, _ := strconv.ParseInt(s.Text(), 10, 64)
+	return i
+}
+
+// ReadInts ...
+func ReadInts(s *bufio.Scanner) []int {
+	s.Scan()
+	strs := strings.Split(s.Text(), " ")
+	nums := make([]int, len(strs))
+	for i, str := range strs {
+		num, _ := strconv.ParseInt(str, 10, 32)
+		nums[i] = int(num)
+	}
+	return nums
+}
+
+// ReadInt64s ...
+func ReadInt64s(s *bufio.Scanner) []int64 {
+	s.Scan()
+	strs := strings.Split(s.Text(), " ")
+	nums := make([]int64, len(strs))
+	for i, str := range strs {
+		num, _ := strconv.ParseInt(str, 10, 64)
+		nums[i] = num
+	}
+	return nums
+}