みなさんこんにちは、ほむほむです。
今回はAtCoder Beginner Contest 169の問題A~問題Dまでの復習投稿です。
【問題A】
後ほど説明文を掲載します。
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
list := getStdinIntArr()
A := list[0]
B := list[1]
fmt.Printf("%d\n", A*B)
}
var sc = bufio.NewReaderSize(os.Stdin, 1024*1024*1)
func getStdin() string {
return readLine()
}
func getStdinIntArr() []int {
str := getStdin()
list := strings.Split(str, " ")
rtn := make([]int, len(list))
for idx, val := range list {
rtn[idx], _ = strconv.Atoi(val)
}
return rtn
}
func readLine() string {
buf := make([]byte, 0, 0)
for {
l, p, _ := sc.ReadLine()
buf = append(buf, l...)
if !p {
break
}
}
return string(buf)
}
【問題B】
後ほど説明文を掲載します。
package main
import (
"bufio"
"fmt"
"math/big"
"os"
"strconv"
"strings"
)
func main() {
N := getStdinInt()
A := getStdinIntArr64()
Abig := make([]*big.Int, N)
for i := 0; i < N; i++ {
Abig[i] = big.NewInt(A[i])
}
for i := 0; i < len(A); i++ {
if A[i] == 0 {
fmt.Printf("0\n")
return
}
if A[i] > 1000000000000000000 {
fmt.Printf("-1\n")
return
}
}
ans := big.NewInt(1)
cmp := big.NewInt(1000000000000000000)
for i := 0; i < len(Abig); i++ {
ans = ans.Mul(ans, Abig[i])
if ans.Cmp(cmp) == 1 {
fmt.Printf("-1\n")
return
}
}
fmt.Printf("%s\n", fmt.Sprint(ans))
fmt.Printf("\n")
}
var sc = bufio.NewReaderSize(os.Stdin, 1024*1024*10)
func getStdin() string {
return readLine()
}
func getStdinInt() int {
str := getStdin()
rtn, _ := strconv.Atoi(str)
return rtn
}
func getStdinIntArr64() []int64 {
str := getStdin()
list := strings.Split(str, " ")
rtn := make([]int64, len(list))
for idx, val := range list {
rtn[idx], _ = strconv.ParseInt(val, 10, 64)
}
return rtn
}
func readLine() string {
buf := make([]byte, 0, 0)
for {
l, p, _ := sc.ReadLine()
buf = append(buf, l...)
if !p {
break
}
}
return string(buf)
}
【問題C】
後ほど説明文を掲載します。
package main
import (
"bufio"
"fmt"
"math"
"os"
"strconv"
"strings"
)
func main() {
list := getStdinArr()
N, _ := strconv.Atoi(list[0])
M, _ := strconv.ParseFloat(list[1], 64)
n := N
m := int(math.Round(M * 100))
fmt.Printf("%d\n", (n*m)/100)
}
var sc = bufio.NewReaderSize(os.Stdin, 1024*1024*1)
func getStdin() string {
return readLine()
}
func getStdinArr() []string {
str := getStdin()
list := strings.Split(str, " ")
return list
}
func readLine() string {
buf := make([]byte, 0, 0)
for {
l, p, _ := sc.ReadLine()
buf = append(buf, l...)
if !p {
break
}
}
return string(buf)
}
【問題D】
後ほど説明文を掲載します。
package main
import (
"bufio"
"fmt"
"math"
"os"
"strconv"
)
func main() {
N := getStdinInt64()
Nori := N
arr := make([]bool, int(math.Sqrt(float64(N)))+1)
// 初期化
for i := 2; i < len(arr); i++ {
arr[i] = true
}
// 素数を求める
arr[0] = false
arr[1] = false
for i := 2; i < len(arr); i++ {
if arr[i] {
for j := i * 2; j < len(arr); j += i {
arr[j] = false
}
}
}
// 割り切れるか判別(素因数分解)
cnt := 0
var i int64
for i = 2; int(i) < len(arr); i++ {
if arr[i] && (N%i) == 0 {
mul := i
pow := 1
for {
if N%mul == 0 {
cnt++
N /= mul
pow++
mul = 1
for n := 0; n < pow; n++ {
mul *= i
}
} else {
break
}
}
if N <= 1 {
break
}
}
}
// 素因数分解のあまり
if N > 1 && int(N) > len(arr) {
cnt++
}
if cnt == 0 && (Nori == 0 || Nori == 1) {
fmt.Printf("%d\n", 0)
} else if cnt == 0 {
fmt.Printf("1\n")
} else {
fmt.Printf("%d\n", cnt)
}
}
var sc = bufio.NewReaderSize(os.Stdin, 1024*1024*1)
func getStdin() string {
return readLine()
}
func getStdinInt64() int64 {
str := getStdin()
rtn, _ := strconv.ParseInt(str, 10, 64)
return rtn
}
func readLine() string {
buf := make([]byte, 0, 0)
for {
l, p, _ := sc.ReadLine()
buf = append(buf, l...)
if !p {
break
}
}
return string(buf)
}