結果
| 問題 |
No.990 N×Mマス計算(Kの倍数)
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2020-02-14 23:17:43 |
| 言語 | Go (1.23.4) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,016 bytes |
| コンパイル時間 | 15,180 ms |
| コンパイル使用メモリ | 225,556 KB |
| 実行使用メモリ | 6,820 KB |
| 最終ジャッジ日時 | 2024-11-16 01:39:05 |
| 合計ジャッジ時間 | 21,059 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 16 WA * 3 |
ソースコード
package main
import (
"sort"
"bufio"
"fmt"
"os"
"strconv"
)
var sc, wr = bufio.NewScanner(os.Stdin), bufio.NewWriter(os.Stdout)
func scanString() string { sc.Scan(); return sc.Text() }
func scanInt() int { a,_ := strconv.Atoi(scanString()); return a }
func scanInt64() int64 { a,_ := strconv.ParseInt(scanString(),10,64); return a }
func scanFloat64() float64 { a,_ := strconv.ParseFloat(scanString(),64); return a }
func scanInts(n int) []int {
res := make([]int, n); for i := 0; i < n; i++ { res[i] = scanInt() }; return res
}
func abs(a int) int { if a<0 { return -a }; return a }
func min(a,b int) int { if a<b { return a }; return b }
func max(a,b int) int { if a>b { return a }; return b }
//•*¨*•.¸¸♪Main•*¨*•.¸¸♪( -ω-)ノ ( ・ω・)
func main() {
sc.Split(bufio.ScanWords)
sc.Buffer(make([]byte, 10000), 1000000)
n := scanInt()
m := scanInt()
k := scanInt()
op := scanString()
ans := 0
b := scanInts(m)
a := scanInts(n)
if op == "+" {
for i := 0; i < m; i++ {
b[i] %= k
}
sort.Ints(b)
// fmt.Println(b)
for i := 0; i < n; i++ {
val := k - a[i]%k
l := sort.Search(len(b), func(j int) bool { return val <= b[j] })
r := sort.Search(len(b), func(j int) bool { return val < b[j] })
ans += r-l
// fmt.Println(val)
}
} else {
kf := factorize(int64(k))
cnt := make(map[int]int, 0)
for i := 0; i < n; i++ {
af := factorize(int64(a[i]))
v := 1
for val, c := range kf {
v *= pow(int(val),max(0,c-af[val]))
}
cnt[v]++
}
// fmt.Println(cnt)
for val, c := range cnt {
for i := 0; i < m; i++ {
if b[i]%int(val) == 0 {
ans += c
}
}
}
// fmt.Println(cnt)
}
fmt.Println(ans)
}
func factorize(n int64) map[int64]int {
res := make(map[int64]int, 0)
for i := int64(2); i*i <= n; i++ {
for n%i == 0 {
res[i]++
n /= i
}
}
if n!=1 {
res[n] = 1
}
return res
}
func pow(a,n int) int {
res := 1
for n>0 {
if n&1 == 1 { res *= a }
a *= a; n >>= 1
}
return res
}