結果

問題 No.990 N×Mマス計算(Kの倍数)
ユーザー yakamotoyakamoto
提出日時 2020-02-14 23:59:46
言語 Kotlin
(1.9.23)
結果
AC  
実行時間 920 ms / 2,000 ms
コード長 4,473 bytes
コンパイル時間 19,124 ms
コンパイル使用メモリ 470,372 KB
実行使用メモリ 90,356 KB
最終ジャッジ日時 2024-04-27 20:39:50
合計ジャッジ時間 24,951 ms
ジャッジサーバーID
(参考情報)
judge1 / judge4
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 250 ms
50,220 KB
testcase_01 AC 271 ms
51,568 KB
testcase_02 AC 286 ms
51,576 KB
testcase_03 AC 266 ms
50,332 KB
testcase_04 AC 283 ms
51,684 KB
testcase_05 AC 276 ms
50,268 KB
testcase_06 AC 295 ms
51,936 KB
testcase_07 AC 283 ms
51,852 KB
testcase_08 AC 255 ms
49,968 KB
testcase_09 AC 248 ms
50,092 KB
testcase_10 AC 487 ms
63,780 KB
testcase_11 AC 573 ms
78,476 KB
testcase_12 AC 920 ms
85,496 KB
testcase_13 AC 537 ms
76,464 KB
testcase_14 AC 524 ms
70,600 KB
testcase_15 AC 480 ms
62,812 KB
testcase_16 AC 523 ms
69,052 KB
testcase_17 AC 471 ms
58,692 KB
testcase_18 AC 917 ms
85,708 KB
testcase_19 AC 736 ms
85,128 KB
testcase_20 AC 628 ms
90,356 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

import java.io.BufferedReader
import java.io.InputStream
import java.io.InputStreamReader
import java.util.*
import kotlin.math.abs
import kotlin.math.max
import kotlin.math.min

val MOD = 1_000_000_007

typealias Fac = List<Pair<Int, Int>>
typealias Cnt = MutableList<Int>

class Solver(stream: InputStream, private val out: java.io.PrintWriter) {

  fun solve() {
    val N = ni()
    val M = ni()
    val K = ni()
    val op = next()
    val B = na(M)
    val A = na(N)

    if (op == "+") {
      val C = mutableMapOf<Int, Int>()
      for (i in 0 until M) {
        val m = B[i] % K
        C.merge(m, 1, Int::plus)
      }

      var ans = 0L
      for (i in 0 until N) {
        val mm = A[i] % K
        val m = (K - mm) % K
        ans += C.getOrDefault(m, 0)
      }
      out.println(ans)
    } else {
      val fk = factorize(K).toList()
      val fkCnt = fk.map{it.second}.toMutableList()
      debug{fk.toString()}
      debug{fkCnt.toString()}

      fun mkCnt(a: IntArray): MutableMap<Cnt, Int> {
        val C = mutableMapOf<Cnt, Int>()
        for (i in 0 until a.size) {
          val fb = factorize(a[i], fk)
          C.merge(filter(fb, fkCnt), 1, Int::plus)
        }
        return C
      }

      val Ca = mkCnt(A)
      val Cb = mkCnt(B)
      debug{Ca.toString()}
      debug{Cb.toString()}

      var ans = 0L
      for (e in Ca) {
        val needed = needs(e.key, fkCnt)
        debug{needed.toString()}
        Cb.forEach {
          if (isSatisfy(it.key, needed)) {
            ans += it.value.toLong() * e.value
          }
        }
      }
      out.println(ans)
    }
  }

  fun factorize(a: Int, base: Fac): Cnt {
    var x = a
    val res = mutableListOf<Int>()
    for (e in base) {
      var cnt = 0
      for (j in 0 until e.second) {
        if (x % e.first != 0) break
        x /= e.first
        cnt++
      }
      res += cnt
    }
    return res
  }

  fun factorize(a: Int): MutableMap<Int, Int> {
    val res = mutableMapOf<Int, Int>()
    var x = a
    loop@while(x > 1) {
      var i = 2
      while(i * i <= x) {
        if (x % i == 0) {
          res.merge(i, 1, Int::plus)
          x /= i
          continue@loop
        }
        i++
      }
      res.merge(x, 1, Int::plus)
      x = 0
    }
    return res
  }

  fun filter(x: Cnt, filter: Cnt): Cnt {
    val res: Cnt = mutableListOf()
    for (i in 0 until x.size) {
      res.add(min(filter[i], x[i]))
    }
    return res
  }

  fun needs(x: Cnt, target: Cnt): MutableList<Int> {
    val res: Cnt = mutableListOf()
    for (i in 0 until x.size) {
      res.add(max(0, target[i] - x[i]))
    }
    return res
  }

  fun isSatisfy(x: Cnt, needed: Cnt): Boolean {
    var ok = true
    for (i in 0 until x.size) {
      ok = ok and (needed[i] <= x[i])
    }
    return ok
  }










































  private val isDebug = try {
    // なんか本番でエラーでる
    System.getenv("MY_DEBUG") != null
  } catch (t: Throwable) {
    false
  }

  private var tokenizer: StringTokenizer? = null
  private val reader = BufferedReader(InputStreamReader(stream), 32768)
  private fun next(): String {
    while (tokenizer == null || !tokenizer!!.hasMoreTokens()) {
      tokenizer = StringTokenizer(reader.readLine())
    }
    return tokenizer!!.nextToken()
  }

  private fun ni() = next().toInt()
  private fun nl() = next().toLong()
  private fun ns() = next()
  private fun na(n: Int, offset: Int = 0): IntArray {
    return map(n, offset) { ni() }
  }

  private inline fun map(n: Int, offset: Int = 0, f: (Int) -> Int): IntArray {
    val res = IntArray(n)
    for (i in 0 until n) {
      res[i] = f(i + offset)
    }
    return res
  }

  private inline fun debug(msg: () -> String) {
    if (isDebug) System.err.println(msg())
  }

  private fun debug(a: LongArray) {
    debug { a.joinToString(" ") }
  }

  private fun debug(a: IntArray) {
    debug { a.joinToString(" ") }
  }

  private fun debug(a: BooleanArray) {
    debug { a.map { if (it) 1 else 0 }.joinToString("") }
  }

  private fun debugDim(A: Array<IntArray>) {
    if (isDebug) {
      for (a in A) {
        debug(a)
      }
    }
  }

  /**
   * 勝手にimport消されるのを防ぎたい
   */
  private fun hoge() {
    min(1, 2)
    max(1, 2)
    abs(-10)
  }
}

fun <A, B> pair(a: A, b: B) = RPair(a, b)
data class RPair<A, B>(val _1: A, val _2: B)

fun main() {
  val out = java.io.PrintWriter(System.out)
  Solver(System.`in`, out).solve()
  out.flush()
}
0